gpt4 book ai didi

c# - EF4 : Why does proxy creation have to be enabled when lazy loading is enabled?

转载 作者:太空宇宙 更新时间:2023-11-03 22:02:57 30 4
gpt4 key购买 nike

我有一个项目结构如下:.Persistence -> .Repo -> .Services -> .Controllers -> MVC3 App。

每一层都有一个带有接口(interface)的相应程序集,还有一些其他程序集,如 .Entities、.ViewModels 和通用代码程序集。

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

其他层是不言自明的...

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

最佳答案

Why does proxy creation have to be enabled when lazy loading is enabled?

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

If I want to set lazyloading = false, can I cast my IEnumerable in Service layer to ObjectQuery in order to use .Include() there?

这取决于你的IEnumerable<T>确实。如果它是 ToList() 的结果那么没有(因为 List<T>IEnumerable<T> 的实现,而不是 IQueryable<T> 的实现。)。如果你只是返回一个 IQueryable<T>作为IEnumerable<T>你可能可以转换为 IQueryable<T> . (在 EF 4.3 中,您将使用 IQueryable<T>DbQuery<T> 而不是 ObjectQuery<T> 。)

但是恕我直言,需要这样的转换表明您的架构中存在问题。使用 Include是查询的修改。如果允许您的服务层修改查询,您的存储库应返回 IQueryable<T> - 此类型用于构建和修改查询。

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

关于c# - EF4 : Why does proxy creation have to be enabled when lazy loading is enabled?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9500642/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com