问题
是否有任何方法可以使得当您尝试访问未特定的导航属性时,从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);
要明确的是,我不希望该属性是Eager-Loaded。我根本不想加载它。我尝试从上下文中分离实体,但这并没有帮助。
背景
我试图这样做的原因是因为我需要在不同于创建DbContext的线程上访问实体对象。因此,我不希望将导航属性设置为某些deferred执行linq语句。问题是因为我无法访问DbContext来检查是否加载了导航属性(由于它不是线程安全的)我无法知道是否需要在当前线程上创建新的DbContext来检索丢失的数据。这与我尝试使用How to tell if a Navigation Property is loaded without DbContext
解决的问题相同更新
将DbContext的Configuration.LazyLoadingEnabled属性设置为false可防止linq自动连接,但对于作为集合的导航属性,这会导致空集合而不是null。
为了解决基于集合的问题,我修改了我的T4模板以生成一个空的默认构造函数,而不是一个将每个ICollection设置为等于空HashSet的构造函数。
答案 0 :(得分:2)
您可以通过设置Configuration.LazyLoadingEnabled
DbContext
属性来启用/禁用延迟加载
context.Configuration.LazyLoadingEnabled = false;
var parents = dbContext.People.Where(p => p.Children.Any()).ToList();
context.Configuration.LazyLoadingEnabled = true;