EF4:为什么在启用延迟加载时必须启用代理创建?

时间:2012-02-29 14:10:58

标签: c# entity-framework entity-framework-4.3

我的项目结构如下: .Persistence - > .Repo - > .Services - > 。控制器 - > MVC3应用程序。

每个图层都有一个带接口的相应程序集,还有一些其他程序集,如.Entities,.ViewModels和公共代码程序集。

持久性 - 它包含EF4 datacontext(代码优先)和对EF4.3的引用。有一个工厂用于创建名为GetContext()的Context,这个工厂实现了IDisposable。这不是一个单身因素我认为这就是温莎会用LifestyleSingleton()为我做的事 Repo - 这包含实现存储库和规范模式(http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/)的存储库。

其他层次不言自明......

问题:
 1.为什么在启用延迟加载时必须启用代理创建?  2.如果我想设置lazyloading = false,我可以将我的IEnumerable在Service层中转换为ObjectQuery,以便在那里使用.Include()吗?

1 个答案:

答案 0 :(得分:4)

  

为什么在启用延迟加载时必须启用代理创建?

因为POCO的延迟加载依赖于代理创建。没有代理延迟加载不起作用。因此,ProxyCreationEnabled = falseLazyLoadingEnabled = true组合毫无意义。反向组合是有意义的,如果您想使用更改跟踪代理但不想使用延迟加载。

  

如果我想设置lazyloading = false,我可以将我的IEnumerable在Service层中转换为ObjectQuery以便在那里使用.Include()吗?

这取决于您IEnumerable<T>真正 的内容。如果它是ToList()的结果,则为no(因为List<T>IEnumerable<T>的实现,而不是IQueryable<T>的实现。)。如果您只是将IQueryable<T>作为IEnumerable<T>返回,则可以转换为IQueryable<T>。 (在EF 4.3中,您可以使用IQueryable<T>DbQuery<T>而不是ObjectQuery<T>。)

但imho需要这样的演员表明你的架构出了问题。使用Include是对查询的修改。如果允许您的服务层修改查询,则存储库应返回IQueryable<T> - 此类型用于构建和修改查询。

如果您的存储库不应返回IQueryable<T>,则必须将表达式或规范传递到存储库方法,该方法用于向查询添加Include - 在存储库方法内部,不在服务层。