2015-11-04 106 views
0

问题禁用延迟加载的实体框架导航属性

有没有什么办法让这个实体从的DbContext查询返回返回null(或其他一些特定的值),当您尝试访问导航属性,你没有具体.Include()?例如:

var parents = dbContext.People.Where(p => p.Children.Any()).Include("Children").ToList(); 
//Assert all parents have children... 
Assert.IsTrue(parents[0].Children.Any()); 

而且......

var parents = dbContext.People.Where(p => p.Children.Any()).ToList(); 
//Assert all children collections are null... NOT LAZY LOADED 
Assert.IsTrue(parents[0].Children == null); 

要清楚,我不希望属性急于装入。我不希望它被加载。我试过从上下文中分离实体,但这没有帮助。

背景

我想这样做的原因是因为我需要访问一个不同势线程比的DbContext创建对一个实体对象。正因为如此,我不希望将导航属性设置为一些有针对性的excution linq语句。问题是,因为我无法访问DbContext来检查导航属性是否加载(由于它不是线程安全的),我无法知道是否需要在当前线程上创建新的DbContext来检索丢失数据。这是我试图用How to tell if a Navigation Property is loaded without DbContext

更新

中的DbContext的Configuration.LazyLoadingEnabled属性设置为false,以解决同样的问题阻止了LINQ从得到自动有线了,但导航性能是集合这会导致一个空集合而不是null。

为了解决基于集合的问题,我修改了我的T4模板来生成一个空的默认构造函数,而不是将每个ICollection设置为一个空的HashSet。

+0

尝试.AsNoTracking的Configuration.LazyLoadingEnabled属性禁用延迟加载()。 – DevilSuichiro

+0

AsNoTracking()阻止上下文缓存实体,但访问导航属性仍会导致尝试查询其创建的上下文。 – NuclearProgrammer

回答

2

可以启用/通过设置您的DbContext

context.Configuration.LazyLoadingEnabled = false; 
var parents = dbContext.People.Where(p => p.Children.Any()).ToList(); 
context.Configuration.LazyLoadingEnabled = true; 
+0

谢谢!这是我正在寻找的。我也需要更新我的T4模板,以便不将基于集合的导航属性设置为空集合。 – NuclearProgrammer