C# EF4:启用延迟加载时,为什么必须启用代理创建?
我的项目结构如下: .Persistence->.Repo->.Services->.Controllers->MVC3应用程序 每个层都有一个各自的带有接口的程序集,还有一些其他程序集,如.Entities、.ViewModels和公共代码程序集 持久性-它保存EF4数据上下文(代码优先)和对EF4.3的引用。有一个工厂用于创建名为GetContext()的上下文,该工厂实现IDisposable。这不是单身原因,我想温莎会用生活方式单身()来帮助我。C# EF4:启用延迟加载时,为什么必须启用代理创建?,c#,entity-framework,entity-framework-4.3,C#,Entity Framework,Entity Framework 4.3,我的项目结构如下: .Persistence->.Repo->.Services->.Controllers->MVC3应用程序 每个层都有一个各自的带有接口的程序集,还有一些其他程序集,如.Entities、.ViewModels和公共代码程序集 持久性-它保存EF4数据上下文(代码优先)和对EF4.3的引用。有一个工厂用于创建名为GetContext()的上下文,该工厂实现IDisposable。这不是单身原因,我想温莎会用生活方式单身()来帮助我。 Repo-这保存了实现存储库和规范模式(
Repo-这保存了实现存储库和规范模式()的存储库 其他层是不言自明的 问题:
1.启用延迟加载时,为什么必须启用代理创建?
2.如果我想设置lazyloading=false,我可以将服务层中的IEnumerable强制转换为ObjectQuery,以便在那里使用.Include() 启用延迟加载时,为什么必须启用代理创建 因为POCOs的延迟加载依赖于代理创建。没有代理,延迟加载无法工作。因此,组合
ProxyCreationEnabled=false
和LazyLoadingEnabled=true
毫无意义。如果您希望使用更改跟踪代理,但不希望使用延迟加载,则反向组合是有意义的
如果我想设置lazyloading=false,我可以将服务层中的IEnumerable强制转换为ObjectQuery,以便在那里使用.Include()
这取决于您的IEnumerable
实际上是什么。如果是ToList()
的结果,则为否(因为List
是IEnumerable
的实现,而不是IQueryable
的实现)。如果只将IQueryable
返回为IEnumerable
,则可能可以强制转换为IQueryable
。(在EF 4.3中,您将使用IQueryable
或DbQuery
而不是ObjectQuery
)
但是,我认为,这样一个演员阵容的需要表明,您的架构中存在一些问题。使用Include
是对查询的修改。如果允许您的服务层修改查询,则存储库应返回IQueryable
——此类型用于生成和修改查询
如果存储库不应返回IQueryable
,则必须将表达式或规范传递到存储库方法中,该存储库方法用于向查询中添加Include
——在存储库方法内部,而不是在服务层中
启用延迟加载时,为什么必须启用代理创建
因为POCOs的延迟加载依赖于代理创建。没有代理,延迟加载无法工作。因此,组合ProxyCreationEnabled=false
和LazyLoadingEnabled=true
毫无意义。如果您希望使用更改跟踪代理,但不希望使用延迟加载,则反向组合是有意义的
如果我想设置lazyloading=false,我可以将服务层中的IEnumerable强制转换为ObjectQuery,以便在那里使用.Include()
这取决于您的IEnumerable
实际上是什么。如果是ToList()
的结果,则为否(因为List
是IEnumerable
的实现,而不是IQueryable
的实现)。如果只将IQueryable
返回为IEnumerable
,则可能可以强制转换为IQueryable
。(在EF 4.3中,您将使用IQueryable
或DbQuery
而不是ObjectQuery
)
但是,我认为,这样一个演员阵容的需要表明,您的架构中存在一些问题。使用Include
是对查询的修改。如果允许您的服务层修改查询,则存储库应返回IQueryable
——此类型用于生成和修改查询
如果存储库不应返回
IQueryable
,则必须将表达式或规范传递到存储库方法中,该存储库方法用于将Include
添加到查询中-在存储库方法中,而不是在服务层中。谢谢。我同意您不在服务层使用include。就使用ObjectQuery的DbQuery isntead而言,您知道为什么DbQuery没有.Where(string)重载,它接受一个实体sql值,如“it.ID>2”?另外,我不想在我的repo项目中引用EntityFramework(大约2mb),因此如果我使用System.Data.Entity命名空间(框架的一部分)中的ObjectQuery,我可以避免这样做。。。使用ObjectQuery而不是DbQuery有什么缺点吗?@diegohb:Entity SQL不受DbContext
支持,这就是为什么Where
没有字符串重载的原因。如果要使用ObjectQuery
,可以使用IObjectContextAdapter
从DbContext
中拉出ObjectContext
(您知道吗?)。但是,除非您真的想使用实体SQL,否则我建议您坚持使用DbContext
,并引用EntityFramework.dll。否则根本没有理由使用DbContext
,那么您可以使用EF4.0。谢谢!是的,我知道objectcontextadapter。我的UI使用jqGrid组件,它提供过滤功能,我计划将过滤参数转换为字符串查询,以传递给我的服务,而我的服务显然需要将其传递给repo(它将访问ObjectContextAdapter和DbContext),以便使用ESQL,其中重载。。。我真的不想在我的UI中硬引用EntityFramework.dll来使用这个重载,我更喜欢使用DbContext。如果你看到了huyrua的链接,我需要让所有的