【问题标题】:Ado.Net Entity : Object doesn't display linked members (foreign keys)Ado.Net 实体:对象不显示链接成员(外键)
【发布时间】:2009-04-14 11:47:08
【问题描述】:

我有一个简单的数据库方案:用户、帐户。用户与帐户是一对多的关系。

我已经生成了一个 ado.net 实体数据模型,我可以创建用户和帐户,甚至可以将它们链接在一起。在数据库中正确填写了account.user_id,所以理论上我应该能够通过实体访问C#中的User.Account.ToList()。

但是,当我尝试访问 User.Account.ToList() 时,结果为零。

User user = db.User.First(U => U.id == 1);
List<Account> accounts = user.Account.ToList(); ##count = 0...

当我在前一个代码之前添加以下代码时,它突然给了我正确的计数 2。

 Account account1 = db.Account.First(A => A.id == 1);
 Account account2 = db.Account.First(A => A.id == 2);
 User user = db.User.First(U => U.id == 1);
 List<Account> accounts = user.Account.ToList(); ##count = 2...??

我在这里错过了什么??

【问题讨论】:

    标签: c# entity-framework ado.net one-to-many


    【解决方案1】:

    您应该为此使用ObjectQuery.Include 方法。您的方法也有效,但会导致额外的查询。

    在你的例子中你会得到

    User user = db.User.Include("Account").First(u => u.id == 1);
    

    您必须弄清楚字符串"Account" 是否正确。通常它应该以MyEntities 之类的东西为前缀。这取决于您的实体的命名空间,但通过一些试验和错误,您应该能够弄清楚这一点。

    【讨论】:

      【解决方案2】:

      是的,这是开始使用实体框架时的常见问题 - 父子关系都不是延迟加载的,因此您必须显式加载它们。如果您要在类/方法之间共享对象上下文,您可能需要检查关系是否已经加载:

      例如

          if(!user.Account.IsLoaded)
              user.Account.Load();
      

      您可以使用简单的扩展方法使这更容易:

      public static class EntityExtensions
      {
          public static void EnsureLoaded(this RelatedEnd relatedEnd)
          {
              if (!relatedEnd.IsLoaded)
                  relatedEnd.Load();
          }
      }
      

      使用它会使您的负载调用再次缩短:

      user.Account.EnsureLoaded();
      

      由于它使用了相关端,这对于实体框架中的父子关系来说是通用的,因此您也可以将其用于父引用关系 - 例如

      account.UserReference.EnsureLoaded();
      

      正如 rwwilden 所说,如果在这种情况下您总是要与父对象一起加载子对象,您可能希望使用 Include 来提高调用效率并避免额外的数据库往返。

      【讨论】:

      • 非常感谢您的回答。在 Linq to Sql 和 Nhibernate 之后,由于没有加载子关系,我在调试时很惊讶
      【解决方案3】:

      我想我对框架的了解有点少。 :)

      您需要先显式加载相关帐户。

      user.Account.Load();
      

      现在它确实显示正确了。

      【讨论】:

        猜你喜欢
        • 2020-03-08
        • 1970-01-01
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 2018-10-06
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多