2012-03-17 58 views
0

我应该首先在EF代码或模型之间做出选择。代码第一和数据加载

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

我试着先从代码开始,但我无法将导航属性作为IQueryable使用。当我宣布导航属性我使用的ICollection这样的:

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

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

当我打开发票,我收集了LineItem是因为懒加载空。

但是,当我从数据库加载此属性时,我会加载该数据库的所有LineItems数据库之前,我可以使用此集合作为IQueryable?

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

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

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

谢谢

+0

“我的导航属性为IQueryable” - 这不总是一个加号。 – 2012-03-17 16:55:53

+0

为什么?我可以将一个查询应用到我的集合属性中,以在数据库受到干扰之前构建SQL查询 – xwrs 2012-03-17 17:00:59

+0

看起来像lazyloading正在做您想要什么,将实际查询延迟到数据库,直到您实际访问记录/实体。但是在某些情况下,您将不得不进行预先加载或关闭lazyloading/proxy,尽管这将是不同的故事。 – 2012-03-17 17:41:35

回答

0

您需要使所有的实体属性变为虚拟。这允许EF为您的实体生成代理类,以便您可以查询它。

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

我启用了延迟加载this.Configuration.LazyLoadingEnabled = true;并设置我的导航。属性为虚拟。但它不影响加载导航属性。发票LineItem正在使用发票加载。它们默认不为null。 – xwrs 2012-03-17 19:13:57

+0

EF 4.1默认启用Lazyloading。如果你的LineItems是虚拟的,我怀疑你需要在别处看问题。这个http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-code-first-walkthrough.aspx和这个http://stackoverflow.com/questions/7619227/entity-framework-code-first-relationships-and-navigation-property应该给你一个想法。 – 2012-03-18 01:37:18

0

需要Virtual关键字进行惰性加载工作。

相关问题