如果我有一个带有主键 (AccLinkID) 和外键 (aspnet_Users UserID) 的表,如何使用 Linq to Entities 选择外键指向的对象。
User myUser = _myDB.AccLinkSet.Where(user => user.LinkID == linkId).FirstOrDefault().aspnet_Users;
不工作...
有人有想法么?
如果我有一个带有主键 (AccLinkID) 和外键 (aspnet_Users UserID) 的表,如何使用 Linq to Entities 选择外键指向的对象。
User myUser = _myDB.AccLinkSet.Where(user => user.LinkID == linkId).FirstOrDefault().aspnet_Users;
不工作...
有人有想法么?
试试这个:
User myUser = _myDB.AccLinkSet.Include("aspnet_Users")
.Where(user => user.LinkID == linkId).FirstOrDefault().aspnet_Users;
尽管正如其他人所建议的那样,您可以使用 Include 解决此问题,但我不会这样做。相反,我会进行项目,它从不需要包含:
var q = from al in yDB.AccLinkSet
where al.LinkID == linkId
select al.aspnet_Users;
在这种情况下,用户会自动加载。
目前,使用 Entity Framework 1,您不会自动延迟加载,例如,如果您想从一个实体遍历到下一个实体,您需要.Include("OtherEntity")
在您的选择上执行以将这些实体包含在查询中,或者您需要显式调用.Load("OtherEntity")
您的 EntityContext 以加载该实体。
这是 EF 团队的设计决定,不支持自动延迟加载,因为他们认为这太危险了;他们想让用户清楚明白地表明他还包含/加载了第二组实体。
由于受欢迎的需求,即将推出的 EF v4(将在 2009 年底的某个时候与 .NET 4.0 一起发布)将支持自动延迟加载 - 如果您希望使用它。您需要显式启用它,因为它默认关闭:
context.ContextOptions.DeferredLoadingEnabled = true;
请参阅有关该新功能的一些文章: