【问题标题】:DataGridView and System.Data.Entity.DynamicProxies when load from entity从实体加载时的 DataGridView 和 System.Data.Entity.DynamicProxies
【发布时间】:2020-02-22 17:26:29
【问题描述】:

我正在寻找几天后的解决方案。我有简单的基础:

和简单的代码:

using System.Data.Entity;
public partial class Form_test
{
    private _dbContext Db = new _dbContex();
    private void Form_test()
    {
        Db.BooksAuthors.Load();
        DGVBookAuthors.DataSource = new BindingSource() { DataSource = Db.BooksAuthors.Local.ToBindingList };
    }
}

效果是:

如何额外显示带有 Books.title 和 Authors.name 的列以及带叶子的 DataBinding?。这甚至可能吗?

【问题讨论】:

    标签: c# datagridview entity-framework-6 entity


    【解决方案1】:

    实体反映数据模型。根据您要显示的信息,视图应该有自己的模型表示。

    例如:

    [Serializable]
    public class BookViewModel
    {
       public int BookId { get; set; }
       public int AuthorId { get; set; }
       public string Title { get; set; }
       public string Author { get; set; }
    }
    

    然后,在加载数据源时:

    var books = DB.BookAuthors.Select(x => new BookViewModel
    {
        BookId = x.Book.id,
        Author = x.Author.id,
        Title = x.Book.title,
        Author = x.Author.name
    }).ToList();
    
    DGVBookAuthors.DataSource = new BindingSource() { DataSource = books };
    

    实体反映数据状态。您可以将实体投影到适合您要显示的视图的视图模型中。当您的视图使用 ID 和数据回调控制器时,您可以使用这些 ID 再次加载实体,并在适用时更新它们的状态。

    将实体传递给视图意味着向客户端发送的数据比需要的多得多,并且容易出现您遇到的问题以及其他序列化错误。

    关于您的初始架构:我怀疑您不需要书籍和作者之间的多对多关系。虽然一个作者可能有很多书,但一本书实际上应该只有一个作者。这将简化架构,因此没有 BookAuthor 表,只有 Book 表上的 AuthorId (idAuthor)。然后查询将被简化为:

    var books = DB.Books.Select(x => new BookViewModel
    {
        BookId = x.id,
        Author = x.Author.id,
        Title = x.title,
        Author = x.Author.name
    }).ToList();
    

    【讨论】:

    • 谢谢,但我希望在显示数据后可以编辑 DataGridView。只是我想使用 Db.SaveChanges();用户编辑 DGV 后。我在书籍和作者之间有多对多的关系,因为在我的方案中,书籍可以有来自 Authors 的许多作者。
    • 您仍然应该考虑视图模型。从视图返回的实体与 DBContext 关联,它们是反序列化的 C# 对象。将它们附加到请求 DbContext 允许过时的数据覆盖您的数据库,并使数据容易被篡改。您的数据网格可以编辑视图模型以传回。验证输入后,Automapper 之类的工具可以通过一个 Map(src, dest) 调用轻松复制允许的值。
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    相关资源
    最近更新 更多