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

Mik*_*ain 60 entity-framework lazy-loading entity-framework-4

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

dataContext.ContextOptions.LazyLoadingEnabled
Run Code Online (Sandbox Code Playgroud)

默认情况下为true.我不想延迟加载,我不想写:

dataContext.ContextOptions.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)

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

Sla*_*uma 67

以下答案涉及Database-FirstModel-First工作流(当询问问题时,实体框架中唯一可用的两个工作流(版本<= 4.0)).如果您正在使用Code-First工作流程(自EF版本> = 4.1以来可用),请转到ssmith 对此问题的答案以获得正确的解决方案.


edmx文件在<ConceptualModel><EntityContainer>定义中有一个延迟加载属性,您可以将延迟加载设置为false:

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false">
Run Code Online (Sandbox Code Playgroud)

这将在ObjectContext构造函数中创建以下设置:

public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext")
{
    this.ContextOptions.LazyLoadingEnabled = false;
    OnContextCreated();
}
Run Code Online (Sandbox Code Playgroud)

我的示例并不意味着应该手动编辑生成的ObjectContext(或DbContext更新的EF版本)(这将被数据库中的每个模型更新覆盖,如ctorx指出的那样)但是EDMX文件部分中的EntityContainer元素edmx:ConceptualModels应该通过添加annotation:LazyLoadingEnabled="false"属性来编辑- 在XML编辑器中手动或在此选项可用的设计器表面的属性页面上进行编辑,右键单击EDMX,然后单击属性.

在此输入图像描述

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

  • 这需要您修改生成的代码,如果修改模型,代码将被覆盖.考虑将ObjectContextFactory放在适当的位置,并在工厂中进行更改.这样你仍然只设置一次选项而你没有更改自动生成的代码. (16认同)

ssm*_*ith 62

我写了一个快速示例,展示了新的Lazy Loading功能如何与EF Code First一起使用.在Code First模型中实现您想要的只是向DbContext的构造函数添加一行,如下所示:

public BlogContext()
{
    this.Configuration.LazyLoadingEnabled = false;
}
Run Code Online (Sandbox Code Playgroud)

  • 这并不重要,但是`:base()`和`this`在这段代码中都是多余的. (11认同)

bea*_*mes 24

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

在这个方法中,我只是调用并设置属性,所有都已解决.

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
     base.Configuration.LazyLoadingEnabled = false;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这将无法工作,因为它将仅为构建模型的上下文实例(通常是应用程序启动后第一个使用的实例)禁用延迟加载.对于所有后来的上下文实例,不调用OnModelCreating`并且`LazyLoadingEnabled`将具有默认值 - 即`true`. (4认同)

Ami*_*aqi 23

你也可以从设计师那里做到.只需打开.edmx文件,右键单击模型上的任意位置,然后选择"属性".然后设置LazyLoadingEnabled为false. 在此输入图像描述