在Entity Framework 4中默认禁用延迟加载

EF4默认启用延迟加载。 至less,在我的项目中,我可以看到价值

dataContext.ContextOptions.LazyLoadingEnabled 

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

 dataContext.ContextOptions.LazyLoadingEnabled = false; 

每次我得到一个新的上下文。 那么有没有办法在整个项目中默认closures它?

下面的答案指的是数据库优先模型优先工作stream程(当问题被提出时,entity framework(版本<= 4.0)只有两个工作stream程可用)。 如果您使用的是Code-First工作stream程(自EF版本> = 4.1后可用),请转到ssmith对此问题的答案以获得正确的解决scheme。


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

 <EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false"> 

这会在ObjectContext构造函数中创build以下设置:

 public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext") { this.ContextOptions.LazyLoadingEnabled = false; OnContextCreated(); } 

我的例子并不意味着应该手动编辑生成的ObjectContext (或更新的EF版本中的DbContext )(这将被ctorx指出的数据库中的每个模型更新所覆盖),而是edmx中的EntityContainer元素edmx:ConceptualModels EDMX文件的edmx:ConceptualModels部分应该通过添加annotation:LazyLoadingEnabled="false"来进行编辑annotation:LazyLoadingEnabled="false"属性 – 无论是在XML编辑器中手动还是在devise器表面的属性页面上,也可以使用该选项。 EDMX文件的这种修改将自动生成与上面所示构造函数中禁用的延迟加载选项一样的上下文类。 从数据库更新模型时,EDMX文件修改本身不会被覆盖。

我写了一个快速示例,展示新的Lazy Loadingfunction如何与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; } 

我的模型现在更可口了。 懒加载是伟大的…但不是当你不想要它。 当你开始有循环引用,这只是荒谬的。

你也可以从devise师那里做到。 只需打开.edmx文件,右键单击模型上的任意位置,然后select“属性”。 然后将LazyLoadingEnabled设置为false。 在这里输入图像说明

如果您正在对代码优先进行build模,只需删除参考/对象属性上的virtual关键字即可。 对引用进行虚拟化将启用该特定引用的LazyLoading。