【问题标题】:How to select an object through a foreign key如何通过外键选择对象
【发布时间】:2009-08-04 03:30:50
【问题描述】:

如果我有一个带有主键 (AccLinkID) 和外键 (aspnet_Users UserID) 的表,如何使用 Linq to Entities 选择外键指向的对象。

User myUser = _myDB.AccLinkSet.Where(user => user.LinkID == linkId).FirstOrDefault().aspnet_Users;

没用……

有人有什么想法吗?

【问题讨论】:

    标签: sql-server asp.net-mvc linq-to-entities foreign-key-relationship


    【解决方案1】:

    试试这个:

    User myUser = _myDB.AccLinkSet.Include("aspnet_Users")
        .Where(user => user.LinkID == linkId).FirstOrDefault().aspnet_Users;
    

    【讨论】:

    • +1 - 是的,Entity Framework 不会自动加载引用的对象集 - 您需要使用 .Load() 显式加载它们,或者使用此 .Include 方法将它们包含在查询结果中。
    • 上面的代码不起作用。 Include 返回一个新的 ObjectQuery,您忽略它(允许收集它)并使用未包含的 ObjectQuery。 Include 和 Where 必须在同一行
    【解决方案2】:

    尽管您可以按照其他人的建议使用 Include 解决此问题,但我不会这样做。相反,我会进行项目,它从不需要包含:

    var q = from al in yDB.AccLinkSet
            where al.LinkID == linkId
            select al.aspnet_Users;
    

    在这种情况下,会自动加载用户。

    【讨论】:

      【解决方案3】:

      目前,使用 Entity Framework 1,您不会自动延迟加载,例如如果您想从一个实体遍历到下一个实体,您需要在您的选择上执行 .Include("OtherEntity") 以将这些实体包含在查询中,或者您需要在您的 EntityContext 上显式调用 .Load("OtherEntity") 以加载该实体。

      这是 EF 团队的设计决定,不支持自动延迟加载,因为他们认为这太危险了;他们想让用户清楚明白地表明他还包含/加载了第二组实体。

      由于受欢迎的需求,即将推出的 EF v4(将在 2009 年底的某个时候与 .NET 4.0 一起发布)将支持自动延迟加载 - 如果您希望使用它。您需要显式启用它,因为它默认关闭:

      context.ContextOptions.DeferredLoadingEnabled = true;
      

      查看有关该新功能的一些文章:

      【讨论】:

        猜你喜欢
        • 2017-04-12
        • 2021-02-01
        • 2019-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多