如何在实体框架中沿导航关系强制进行完整加载



好吧,我第一次尝试使用ADO.NET实体框架。

我现在的测试用例包括一个SQL Server 2008数据库,该数据库有两个表,Member和Profile,具有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示例似乎表明,我将能够无缝地遵循这样的导航关系,但它似乎不起作用。我发现,如果我第一次以某种方式在单独的调用中加载配置文件,比如使用实体。Profile.ToList,然后是m。Profile将指向一个有效的Profile。

因此,我的问题是,是否有一种优雅的方法可以强制框架沿着导航关系自动加载数据,或者我是否需要通过联接或其他方式明确地这样做?

感谢

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

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

我在一对多关系中使用了这种技术,效果很好。我有一个Survey类,其中有许多问题是从另一个数据库表中提取的,使用这种技术可以提取相关问题。。。

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]);
    }

任何改进的指针都是最受欢迎的:-)

在进行更多研究后发现。。。StackOverflow链接有一个post-to-Func链接,这比我的扩展方法尝试要好得多:-)

相关内容

  • 没有找到相关文章

最新更新