0

我有一个相当深的对象图,并且想急切地加载整个图。

我知道我可以使用 .Include() 急切地加载特定的导航属性。

然而,这似乎很脆弱(如果我添加一个导航属性,我还必须添加一个额外的 .Include)并且需要(在我的情况下)相当多的 .Include() 语句。

有没有办法指示 EF 急切地加载整个对象图?

4

2 回答 2

1

您必须手动包含要预先加载的每个导航属性。EF 不提供任何内置方式来包含所有内容。

然而,这似乎很脆弱(如果我添加一个导航属性,我还必须添加一个额外的 .Include)并且需要(在我的情况下)相当多的 .Include() 语句。

它比自动包含所有内容更脆弱。这样的特性只会导致太多的问题,因为在许多情况下它会意外地急切地加载导航属性。

作为一种解决方法,您可以创建一些自定义扩展方法,该方法将探索实体类型的 EF 元数据并Include为图表中的每个导航属性添加调用。

几个提议的功能可用于改进 EF 中的急切加载。您可以浏览它们,为您认为有价值的功能投票或提出新的功能。

于 2012-04-27T07:27:30.873 回答
0

然而,这似乎很脆弱(如果我添加一个导航属性,我还必须添加一个额外的 .Include)并且需要(在我的情况下)相当多的 .Include() 语句。

为了将加载对象图的所有代码保存在一个地方,我创建了一个扩展方法,可以在代码中的任何位置使用

static public IQueryable<My> IncludeAll(this DbSet<My> parent)
{
    var include = parent
        .Include(p => p.CollA)
        .Include(p => p.CollB)
        .Include(p => p.CollC)
        .Include(p => p.CollD)
        .Include(p => p.CollE)
        .Include(p => p.CollF)
        .Include(p => p.Etc);

    return include;
}

用法

var query = ctx.Mys.IncludeAll().Where(...);
于 2015-10-03T19:10:19.583 回答