我的项目结构如下: .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()吗?
答案 0 :(得分:4)
为什么在启用延迟加载时必须启用代理创建?
因为POCO的延迟加载依赖于代理创建。没有代理延迟加载不起作用。因此,ProxyCreationEnabled = false
和LazyLoadingEnabled = 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
- 在存储库方法内部,不在服务层。