將我的專案升級到 EF Core 6 后,我有一個奇怪的行為:
我的 dbcontext 中有兩個具有多對多關系的類 - 如下所示:
public class SiteImage
{
public int siteImageId { get; set; }
public string siteImageUrl { get; set; }
...
public ICollection<SiteImageCategory> categories { get; set; }
}
public class SiteImageCategory
{
public int siteImageCategoryId { get; set; }
public string name { get; set; }
public ICollection<SiteImage> images { get; set; }
}
它們映射到 DBContext 中的表
public DbSet<SiteImage> images { get; set; }
public DbSet<SiteImageCategory> categories { get; set; }
如果我想使用此代碼檢索所有影像:
var images = await _context.images.ToListAsync();
我得到了所有類別 = null 的影像串列,這就是我所期望的。
但是,如果我想使用急切加載來包含類別,如下所示:
var images = await _context.images
.Include(x => x.categories)
.ToListAsync();
我得到了包含類別的串列,但任何類別都包括所有相關影像,相關類別處于無限回圈中(通過ReferenceHandler.IgnoreCycles設定停止)。
根據 include 陳述句,我本來希望代碼停止在類別級別。
我究竟做錯了什么?
謝謝
uj5u.com熱心網友回復:
根據包括宣告,我本來預計會停留在類別級別。
它做了。但是,當加載每個 SiteImageCategory 時,如果其 SiteImage 已經在更改跟蹤器中,則關系將被“修復”。因此,如果您加載所有SiteImage,您將已經在 Change Tracker 中擁有每個 SiteImageCategory 的 SiteImage,并且將填充反向導航屬性集合。
uj5u.com熱心網友回復:
ReferenceHandler.IgnoreCycles
這與 EF 無關,也與它做錯的任何事情無關。您正在序列化您的資料庫物體圖,您應該避免這樣做,因為它是一個雙向鏈接圖。
影像 X 具有類別 Y、Z 等,這些類別具有影像,其中一個是影像 X,其中..
有類別 Y、Z 等,這些類別有影像,其中之一是影像 X,其中..
有類別 Y、Z 等,這些類別有影像,其中之一是影像 X,其中..
有類別 Y、Z 等,這些類別有影像,其中之一是影像 X,其中..
等等。
當序列化器序列化圖形時,它將經過這些路徑并進入一個回圈,只有在它能夠跟蹤它以前見過的所有內容時才會停止
如果您不想依賴它,那么還有其他選擇:
- 斷開反向關系 - 清空每個類別中的所有 .Images 集合。這意味著您可以從影像開始并前往某個類別,但沒有類別會鏈接回影像
- 根本不序列化資料庫物體圖;將其映射到沒有回圈的(一組)視圖模型(影像視圖模型可能具有某些類別視圖模型,但類別視圖模型不具有/某些影像視圖模型)
我想說后一種方法可能是最常見的,并且不要序列化資料庫物體
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/419861.html
標籤:
上一篇:將左聯接添加到Linq查詢時出錯
