【发布时间】:2016-11-18 06:43:32
【问题描述】:
我尽量保持简短:
我有一个包含一些表的简单数据库: 艺术家、专辑、歌曲。
- 艺术家可能有多个专辑。专辑可能是由多位艺术家创作的(多对多)。
- 专辑可能包含多首歌曲,但一首歌曲仅限于一张专辑(一对多)。
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