代码优先和数据加载

时间:2012-03-17 16:53:09

标签: c# entity-framework database-design

我应首先在EF代码或模型之间做出选择。

我不确定什么是开发效率的最佳解决方案和IoC框架集成的最简单解决方案。

我尝试先从代码开始,但我无法将导航属性用作IQueryable。当我声明导航属性时,我使用ICollection,如:

public class Invoice {
...
   public ICollection<LineItem> LineItems { get; set; }
...
}

public class LineItem {
...
   public Invoice Invoice { get; set; }
...
}

当我加载Invoice时,由于延迟加载,我的LineItems集合为空。

但是当我从数据库加载此属性时,我会从数据库中加载此Invoice的所有LineItems,然后才能将此Collection用作IQueryable吗?

我的想法是使用IQueryable尽可能减少数据库加载以提高性能。

我做错了什么?什么是最佳做法?

当我首先使用数据库时,我可以使用我的导航属性作为IQueryable开箱即用,而无需编写任何代理类或包装器。

谢谢

2 个答案:

答案 0 :(得分:0)

您需要将所有实体属性设为虚拟。这允许EF为您的实体生成代理类,以便您可以对其进行查询。

public class Invoice {
     public virtual ICollection<LineItem> LineItems { get; set; }
}

答案 1 :(得分:0)

需要 Virtual关键字以使延迟加载工作。