【问题标题】:EF4: Why does proxy creation have to be enabled when lazy loading is enabled?EF4:为什么启用延迟加载时必须启用代理创建?
【发布时间】:2012-02-29 14:10:57
【问题描述】:

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

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

持久性 - 这包含 EF4 数据上下文(代码优先)和对 EF4.3 的引用。有一个用于创建上下文的工厂,称为 GetContext(),该工厂实现了 IDisposable。这不是单例,因为我认为 Windsor 会使用 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()吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    这取决于你的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 添加到您的查询中 - 在存储库方法内部,而不是在服务中层。

    【讨论】:

    • 谢谢。我同意你关于不在服务层使用包含的观点。至于使用 DbQuery 而不是 ObjectQuery,你知道为什么 DbQuery 没有 .Where(string) 重载,它接受像 "it.ID > 2" 这样的实体 sql 值吗?另外,我不想在我的 repo 项目中引用 EntityFramework(大约 2mb),所以如果我使用 System.Data.Entity 命名空间(框架的一部分)中的 ObjectQuery,我可以避免这样做......使用 ObjectQuery 代替 DbQuery 有什么缺点吗?
    • @diegohb:实体 SQL 不支持 DbContext,这就是为什么 Where 没有字符串重载。如果你想使用ObjectQuery,你可以使用IObjectContextAdapterDbContext中取出ObjectContext(你知道吗?)。但除非您真的想使用 Entity SQL,否则我建议您坚持使用 DbContext 并引用 EntityFramework.dll。否则根本没有理由使用DbContext,那么你可以使用EF 4.0。
    • 谢谢!是的,我知道 objectcontextadapter。我的 UI 使用 jqGrid 组件并提供过滤,我计划将过滤参数转换为字符串查询以传递给我的服务,该服务显然需要将其传递给 repo(它将有权访问 ObjectContextAdapter 和 DbContext)为了使用 ESQL Where 重载...我真的不想在我的 UI 中硬引用 EntityFramework.dll 只是为了使用这个重载,而且我更愿意坚持使用 DbContext。如果你看过 huyrua 的链接,我需要重载所有的 GenericRepo 方法。
    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多