我有一个有趣的问题: 我创建了一个名为“容器”的类,其中包含“Contained”类型的成员 它看起来像是:
public class Container
{
public Contained cnt{ get; set; }
}
模型包含两个表,我的数据库看起来像: 容器(PK:id FK:Contained_ContainedId) 包含(PK:ContainedId)
EF代码首先将此属性映射为Contined表中的外键。 当我想使用LINQ检索这些对象时出现问题:
Container Con=(from Object in PersistentManager.Containers.OfType<Container> select Object).SingleOrDefault();
这种方式(或者是一个匿名类型),我得到一个Container。问题是,对Contained对象的引用总是为null。我认为这是为了性能而故意制作的,但是,这一次,我需要它来恢复完整的对象。 Intellitrace显示它甚至没有连接表,所以我猜其他东西应该被指定 有什么想法吗?
Allrigth,感谢Basic,我已经使用include子句解决了这个问题。 我认为应该是一种在上下文封闭环境中使用延迟加载的方法(多层模式总是建议处理这些对象)
答案 0 :(得分:1)
好的...
您需要Include
相关表格。例如
(from PersistentManager.Containers.Include("Contained").OfType...
每次都可以包含多个表
(from PersistentManager.Containers.Include("Contained").
Include("OtherContained").
Include("Contained.SomeOtherLinkedType").
OfType...
等等
n-Tier上的延迟加载取决于您希望如何处理数据。我个人更喜欢在DAL / BL中启用延迟加载,但是将非EF DTO(实际上与您的实体相同但未映射)传递到UI。通过这种方式,BL可以轻松获取所需的数据,并且UI可以获得“惰性”对象。