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

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-这保存了实现存储库和规范模式(

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

每个层都有一个各自的带有接口的程序集,还有一些其他程序集,如.Entities、.ViewModels和公共代码程序集

持久性-它保存EF4数据上下文(代码优先)和对EF4.3的引用。有一个工厂用于创建名为GetContext()的上下文,该工厂实现IDisposable。这不是单身原因,我想温莎会用生活方式单身()来帮助我。
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的链接,我需要让所有的