Ado.Net实体:对象不显示链接的成员(外键)
-
09-09-2019 - |
题
我有一个简单databasescheme:用户,帐户。用户具有与帐户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...
在我前面的代码之前添加以下代码突然给了我正确的计数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...??
我是什么在这里失踪??
解决方案
您应该使用 ObjectQuery.Include 以这种方法。你的方法也适用,但会导致额外的查询。
在您的例子中,你将获得
User user = db.User.Include("Account").First(u => u.id == 1);
您必须找出字符串"Account"
是否正确。通常它应该像MyEntities
前缀。这取决于你的实体的命名空间,但有一点尝试和错误,你应该能够想出解决办法。
其他提示
是的,这就是开始使用实体框架时,一个共同的问题 - 父母都不也不子女关系是懒加载,所以你必须明确地加载它们。如果你要围绕共享类/方法的对象上下文你可能要做出一个检查,看看如果这种关系已经被加载:
e.g。
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();
和,因为它采用的是RelatedEnd,这是常见于实体框架父子关系,你可以用这个家长参考的关系太 - e.g
account.UserReference.EnsureLoaded();
由于rwwilden说,如果你总是要加载在这种情况下,父亲的子对象,你可能需要使用一个包含拨打电话更加高效和避免额外的往返到数据库。
我想我的知识是有点小框架。 :)
您需要先明确加载相关帐户。
user.Account.Load();
现在它正确显示。
不隶属于 StackOverflow