默认情况下,在Entity Framework 4中禁用延迟加载

时间:2010-06-03 15:08:43

标签: entity-framework lazy-loading entity-framework-4

似乎在EF4中默认启用了延迟加载。至少,在我的项目中,我可以看到

的价值
dataContext.ContextOptions.LazyLoadingEnabled

默认为true。我不想延迟加载,我不想写:

dataContext.ContextOptions.LazyLoadingEnabled = false;

每次我获得新的背景。那么有没有办法在整个项目中默认关闭它?

5 个答案:

答案 0 :(得分:65)

以下答案涉及数据库优先模型优先工作流程(实体框架中唯一可用的两个工作流程(版本< = 4.0)问的问题)。如果您使用的是代码优先工作流程(自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指出的那样) out)但是应该通过添加EntityContainer属性来编辑EDMX文件的edmx:ConceptualModels部分中的annotation:LazyLoadingEnabled="false"元素 - 可以在XML编辑器中手动编辑,也可以在设计器的属性页面上编辑此选项可用的曲面,右键单击EDMX,然后单击属性。

enter image description here

EDMX文件的这个修改将自动生成上下文类,在构造函数中使用禁用的延迟加载选项,如上所示。从数据库更新模型时,EDMX文件修改本身不会被覆盖。

答案 1 :(得分:60)

我写了一个显示how the new Lazy Loading features work with EF Code First的快速示例。在Code First模型中实现您想要的只是在DbContext的构造函数中添加一行,如下所示:

public BlogContext()
{
    this.Configuration.LazyLoadingEnabled = false;
}

答案 2 :(得分:24)

如果你可能正在使用EF4 Code First,是吗?因此,在上下文的初始化中,存在“OnModelCreated”的覆盖。

在这种方法中,我只需调出并设置属性,所有内容都已解决。

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
     base.Configuration.LazyLoadingEnabled = false;
}

我的模型现在更加美味。延迟加载很棒......但是当你不想要它时就不行了。当你开始使用循环引用时,这太荒谬了。

答案 3 :(得分:23)

你也可以从设计师那里做到。只需打开.edmx文件,右键单击模型上的任意位置,然后选择“属性”。然后将LazyLoadingEnabled设置为false。 enter image description here

答案 4 :(得分:4)

如果您是代码优先建模,只需删除引用/对象属性上的virtual关键字。在引用上使用虚拟将在该特定引用上启用LazyLoading。