如何在 Entity Framework 中强制沿导航关系进行完整加载?

Posted

技术标签:

【中文标题】如何在 Entity Framework 中强制沿导航关系进行完整加载?【英文标题】:How can I force a complete load along a navigation relationship in Entity Framework? 【发布时间】:2010-09-15 08:47:20 【问题描述】:

好的,所以我第一次尝试使用 ADO.NET Entity Framework。

我现在的测试用例包括一个 SQL Server 2008 数据库,其中包含 2 个表,成员和配置文件,关系为 1:1。

然后我使用实体数据模型向导从数据库中自动生成 EDM。它生成了一个具有正确关联的模型。现在我想这样做:

ObjectQuery<Member> members = entities.Member;
IQueryable<Member> membersQuery = from m in members select m;
foreach (Member m in membersQuery)

   Profile p = m.Profile;
   ...

半途而废。我能够遍历所有成员。但我遇到的问题是 m.Profile 始终为空。 MSDN 库上的 LINQ to Entities 示例似乎表明我将能够无缝地遵循这样的导航关系,但它似乎不是那样工作的。我发现如果我首先以某种方式在单独的调用中加载配置文件,例如使用entities.Profile.ToList,那么m.Profile 将指向一个有效的配置文件。

所以我的问题是,有没有一种优雅的方法可以强制框架自动加载导航关系中的数据,或者我是否需要通过连接或其他方式明确地执行此操作?

谢谢

【问题讨论】:

【参考方案1】:

好的,我设法在这里找到了我需要的答案http://msdn.microsoft.com/en-us/magazine/cc507640.aspx。以下查询将确保已加载 Profile 实体:

IQueryable<Member> membersQuery = from m in members.Include("Profile") select m;

【讨论】:

【参考方案2】:

我在一对多的关系上使用了这种技术并且效果很好。我有一个调查类和许多问题作为来自不同数据库表的一部分,并使用这种技术设法提取相关问题......

context.Survey.Include("SurveyQuestion").Where(x => x.Id == id).First()

(上下文是生成的 ObjectContext)。

context.Survey.Include<T>().Where(x => x.Id == id).First()

我只花了 10 分钟试图组合一个扩展方法来做到这一点,我能想出的最接近的是......

    public static ObjectQuery<T> Include<T,U>(this ObjectQuery<T> context)
    
        string path = typeof(U).ToString();
        string[] split = path.Split('.');

        return context.Include(split[split.Length - 1]);
    

任何改进的指针都将受到欢迎:-)

【讨论】:

【参考方案3】:

在进行更多研究后发现...*** link 在Func link 上有一个帖子,这比我的扩展方法尝试要好得多:-)

【讨论】:

以上是关于如何在 Entity Framework 中强制沿导航关系进行完整加载?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Entity Framework Code First 设置唯一约束?

如何在 Entity Framework Core 中运行存储过程?

如何在 Entity Framework Core 中运行存储过程?

如何在 Entity Framework Core 2 中播种?

我应该如何在 Entity Framework 6 中播种数据

如何在 Entity Framework 6 中使用 DbDataReader 获取表名?