看起来EF4默认启用了延迟加载。至少在我的项目中,我可以看到
dataContext.ContextOptions.LazyLoadingEnabled
默认情况下是true。我不想使用延迟加载,也不想写:
dataContext.ContextOptions.LazyLoadingEnabled = false;
每次我得到一个新的上下文时,都会出现这个问题。因此,是否有一种方法可以默认关闭它,比如在整个项目中?
看起来EF4默认启用了延迟加载。至少在我的项目中,我可以看到
dataContext.ContextOptions.LazyLoadingEnabled
默认情况下是true。我不想使用延迟加载,也不想写:
dataContext.ContextOptions.LazyLoadingEnabled = false;
每次我得到一个新的上下文时,都会出现这个问题。因此,是否有一种方法可以默认关闭它,比如在整个项目中?
以下答案是针对 Database-First 或 Model-First 工作流程(在提问时,这两种工作流程是 Entity Framework(版本 <= 4.0)唯一可用的两种工作流程)。如果您正在使用 Code-First 工作流程(自 EF 版本 >= 4.1 起可用),请参阅 ssmith 的 answer 以获取正确的解决方案。
<ConceptualModel>
和<EntityContainer>
定义中,有一个用于延迟加载的属性,您可以将其通常设置为false:<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false">
public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext")
{
this.ContextOptions.LazyLoadingEnabled = false;
OnContextCreated();
}
我的例子并不是说生成的 ObjectContext
(或新版 EF 中的 DbContext
)应该手动编辑(这会被每次从数据库更新模型时覆盖,正如 ctorx 所指出的那样),而是在 EDMX 文件的 edmx:ConceptualModels
部分的 EntityContainer
元素中添加 annotation:LazyLoadingEnabled="false"
属性进行编辑 - 可以在 XML 编辑器中手动添加,也可以在设计器表面的属性页面上使用此选项,右键单击 EDMX 然后选择 Properties。
public BlogContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
: base()
和 this.
都是多余的,虽然它们并不重要。 - Ben Lesh如果你正在使用EF4 Code First,那么在你的上下文初始化时,有一个"OnModelCreated"的重写方法。
在这个方法中,我只是调用了并设置了属性,然后问题就解决了。
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.Configuration.LazyLoadingEnabled = false;
}
我的模型现在更易使用了。懒加载很好...但是当你不想要它时就不适用了。而且当你开始出现循环引用时,这就太荒谬了。
OnModelCreating
方法都不会被调用,LazyLoadingEnabled
属性将具有默认值 - 即 true
。 - SlaumaDbContext
的答案,而这个问题提问时ObjectContext
还没有出现。问题中的代码片段仍然是针对ObjectContext
的。现在你已经将其编辑成了一个正确的DbContext
答案,但它与ssmith的答案是一样的,而且比他的答案还要早一年。但两者都不是ObjectContext
的答案。相当疯狂 :) - Slaumavirtual
关键字即可。在引用上使用虚拟关键字将启用该特定引用上的LazyLoading。