【问题标题】:EF6: Setting DataGridView's DataSource to an EF-Entity results in loading its children as well. Why?EF6:将 DataGridView 的 DataSource 设置为 EF-Entity 也会导致加载其子项。为什么?
【发布时间】:2016-11-18 06:43:32
【问题描述】:

我尽量保持简短:

我有一个包含一些表的简单数据库: 艺术家、专辑、歌曲。

  1. 艺术家可能有多个专辑。专辑可能是由多位艺术家创作的(多对多)。
  2. 专辑可能包含多首歌曲,但一首歌曲仅限于一张专辑(一对多)。

EntityFramework 将这些表放入类中就好了。现在我将我的 DbContext 实例绑定到 Windows 窗体 C# 项目中的 DataGridView:

DBEntities db = new DBEntities();
db.Artists.Include(a => a.Albums).Load(); // include children albums as well
artistBindingSource.DataSource = db.Artists.Local.ToBindingList();

DataGridView 实例正确显示内容。我可以保存更改等。

如果用户单击 DataGridView 中的单元格(带有艺术家姓名),我将通过将第二个 DataGridView(带有albumBindingSource)分配给艺术家的专辑集合来加载相关专辑:

Artist a = (Artist)row.DataBoundItem; // row contains selected grid row
if (a != null)
{
    albumBindingSource.DataSource = a.Albums;
}

这也可以,但是在调试 SQL 语句时我发现了一些奇怪的东西: 当将第二个 DataGridView 的 DataSource 分配给 a.albums(即所选实例的专辑)时,Entity Framework 还会在多个 SELECT 语句中延迟加载专辑的歌曲(每首歌曲一个)。

问题 1: 为什么还要加载相册的子项?我从来没有告诉它这样做。


但是:如果我将以下代码添加到预加载实体的行中,延迟加载就会消失:

db.Artists.Include(c => c.Albums.Select(b => b.Songs)).Load();

问题 2: 为了防止延迟加载,我真的需要预加载所有子孙吗?我从不希望孙辈出现在我的 Windows 窗体中。

问题 3:(见问题 2)为什么是先“包含”然后再“选择”?我认为类似...

db.Artists.Include(c => c.Albums.Include(d => d.Songs)).Load();

...会更直观。

无论如何:感谢您在这里帮助我!

【问题讨论】:

    标签: c# winforms entity-framework datagridview lazy-loading


    【解决方案1】:

    它正在加载实体可能是因为打开了 LazyLoading。您可以通过db.Configuration.LazyLoadingEnabled = false; 关闭LazyLoading,无需加载所有内容。此外,还有两个Include 方法(不包括重载)。一个是DbQuery<TEntity>的方法,DbSet<TEntity>继承了它,所以你可以看到你的集合的Include方法,另一个在QuerableExtensions类中,这是IQuerable<T>的扩展方法,在System.Data.Entity命名空间中.所以它是为IQuerable 编写的,您使用Select 方法指定集合子级。

    【讨论】:

    • 感谢阿迪尔,成功了。但有一件事我仍然无法理解:如果我只调用 db.Artists.Load();一开始,没有延迟加载。 SELECT 语句仅包含艺术家表。但是如果我将第二个 DataGridView 绑定到 a.Albums,延迟加载会自动完成。
    • @AudioGuy,我很高兴,如果工作。什么是你无法理解的?
    • 抱歉,我的第一条评论发送得太早了 ;-)
    • @AudioGuy,LazyLoading 在您访问属性时起作用并加载数据,例如,如果我想从数据库中获取人员详细信息,select query 将仅发送给人员,如果我想访问某个人的导航属性,将再次发送另一个选择查询,例如person.Documents
    猜你喜欢
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2013-05-09
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多