C# Net实体:对象不';t显示链接成员(外键)

C# Net实体:对象不';t显示链接成员(外键),c#,entity-framework,ado.net,one-to-many,C#,Entity Framework,Ado.net,One To Many,我有一个简单的数据库方案:用户、帐户。用户与帐户具有1对多关系 我已经生成了一个ado.net实体数据模型,我可以创建用户和帐户,甚至可以将它们链接在一起。在数据库中,account.user_id填写正确,因此理论上我应该能够通过实体访问C#中的user.account.ToList() 但是,当我尝试访问User.Account.ToList()时,结果为零 User user = db.User.First(U => U.id == 1); List<Account> a

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

我已经生成了一个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...
User User=db.User.First(U=>U.id==1);
列表帐户=user.Account.ToList()##计数=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...??
accountaccount1=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);
列表帐户=user.Account.ToList()##计数=2。。。??

我在这里遗漏了什么???

我想我的知识对框架来说有点小。:)

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

user.Account.Load();
现在它确实显示正确。

您应该使用此方法。您的方法也可以工作,但会导致额外的查询

在你的例子中,你会得到

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

您必须确定字符串
“Account”
是否正确。通常它的前缀应该是
MyEntities
。这取决于实体的名称空间,但通过一些尝试和错误,您应该能够解决这个问题。

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

e、 g

您可以使用一种简单的扩展方法简化此过程:

public static class EntityExtensions
{
    public static void EnsureLoaded(this RelatedEnd relatedEnd)
    {
        if (!relatedEnd.IsLoaded)
            relatedEnd.Load();
    }
}
使用此选项可再次缩短加载调用:

user.Account.EnsureLoaded();
由于它使用RelatedEnd,这在实体框架中的父关系和子关系中很常见,因此您也可以将其用于父引用关系-例如

account.UserReference.EnsureLoaded();

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

非常感谢您的回答。在linqtosql和Nhibernate之后,我在调试时感到惊讶,因为没有加载子关系
account.UserReference.EnsureLoaded();