簡體   English   中英

禁用延遲加載實體框架導航屬性

[英]Disable Lazy-Load Entity Framework Navigation Properties

是否有任何方法可以使當嘗試訪問未明確包含.include()的導航屬性時,從DbContext查詢返回的實體返回null(或其他特定值)? 例如:

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的線程不同的線程上訪問實體對象。 因此,我不希望將Navigation屬性設置為某些延遲執行linq語句。 問題是,由於我無法訪問DbContext以檢查導航屬性是否已加載(由於它不是線程安全的),因此我無法知道是否需要在當前線程上創建新的DbContext來檢索丟失的屬性數據。 這是我試圖解決的相同問題,即如何確定是否在沒有DbContext的情況下加載了導航屬性

更新資料

將DbContext的Configuration.LazyLoadingEnabled屬性設置為false可以防止linq自動連接,但是對於作為集合的導航屬性,這將導致一個空集合而不是null。

為了解決基於集合的問題,我修改了T4模板以生成一個空的默認構造函數,而不是將每個ICollection設置為一個空HashSet的默認構造函數。

您可以通過設置DbContextConfiguration.LazyLoadingEnabled屬性來啟用/禁用延遲加載

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM