2015-11-04 163 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