似乎在EF4中默认启用了延迟加载。至少,在我的项目中,我可以看到它的价值
dataContext.ContextOptions.LazyLoadingEnabled
默认情况下为true。我不想延迟加载,我不想写:
dataContext.ContextOptions.LazyLoadingEnabled = false;
每次我得到一个新的背景。那么有没有办法在整个项目中默认关闭它?
以下答案涉及Database-First或Model-First工作流(当询问问题时,实体框架中唯一可用的两个工作流(版本<= 4.0))。如果您正在使用Code-First工作流程(自EF版本> = 4.1以来可用),请转到ssmith的answer以获取正确的解决方案。
edmx文件在<ConceptualModel>
和<EntityContainer>
定义中有一个延迟加载属性,你可以将延迟加载设置为false:
<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false">
这将在ObjectContext构造函数中创建以下设置:
public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext")
{
this.ContextOptions.LazyLoadingEnabled = false;
OnContextCreated();
}
我的例子并不意味着应该手动编辑生成的ObjectContext
(或更新的EF版本中的DbContext
)(这将被数据库中的每个模型更新覆盖,如ctorx所指出的那样)但是EntityContainer
部分中的edmx:ConceptualModels
元素应该通过添加annotation:LazyLoadingEnabled="false"
属性来编辑EDMX文件 - 可以在XML编辑器中手动创建,也可以在此选项可用的设计器表面的属性页面上进行编辑,右键单击EDMX,然后单击属性。
对EDMX文件的这种修改将自动生成上下文类,其中构造函数中具有禁用的延迟加载选项,如上所示。从数据库更新模型时,EDMX文件修改本身不会被覆盖。
我写了一个快速的样本显示how the new Lazy Loading features work with EF Code First。在Code First模型中实现您想要的只是向DbContext的构造函数添加一行,如下所示:
public BlogContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
如果你可能正在使用EF4 Code First,是吗?因此,在上下文的初始化中,存在“OnModelCreated”的覆盖。
在这个方法中,我只是调用并设置属性,所有都已解决。
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.Configuration.LazyLoadingEnabled = false;
}
我的模型现在更加可口。延迟加载很棒......但是当你不想要它时就不行了。当你开始使用循环引用时,这太荒谬了。
如果您是代码优先建模,只需删除引用/对象属性上的virtual
关键字。在引用上使用虚拟将在该特定引用上启用LazyLoading。