如何在EF Code First中检索复合类,在多层应用程序上指定了关系?

时间:2012-10-21 15:54:36

标签: linq entity-framework ef-code-first

我有一个有趣的问题: 我创建了一个名为“容器”的类,其中包含“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子句解决了这个问题。 我认为应该是一种在上下文封闭环境中使用延迟加载的方法(多层模式总是建议处理这些对象)

1 个答案:

答案 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可以获得“惰性”对象。