急切地使用EF Code First加载对象图

时间:2012-04-26 23:06:10

标签: entity-framework-4 ef-code-first

我有一个相当深的对象图,并希望急切加载整个图。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

  

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

它比自动化包含所有东西更不脆弱。这样的功能只会导致太多问题,因为在许多情况下,它会意外地加载导航属性。

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

several proposed features用于改善EF的急切加载。您可以浏览它们,提升您认为有价值的功能或提出新功能。

答案 1 :(得分: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(...);