簡體   English   中英

EF Core 6 的多級屬性

[英]Multiple level properties with EF Core 6

從 .NET 5.0 升級到 .NET 6.0(包括作為實體框架的所有相關 Microsoft 庫)后,我在使用 EF Core 對我的數據庫上下文執行查詢時開始收到此錯誤:

System.InvalidOperationException:為警告“Microsoft.EntityFrameworkCore.Query.NavigationBaseIncludeIgnored”生成錯誤:導航“MarkersTranslation.Marker”被查詢中的“包含”忽略,因為修復將自動填充它。 如果之后在“包含”中指定了任何進一步的導航,那么它們將被忽略。 走回包括樹是不允許的。 通過將事件 ID 'CoreEventId.NavigationBaseIncludeIgnored' 傳遞給 'DbContext.OnConfiguring' 或 'AddDbContext' 中的 'ConfigureWarnings' 方法,可以抑制或記錄此異常。

這是有罪的代碼:

Tour tour = await _context.Tours.Include(mpt => mpt.MarkersPerTours)
                                .ThenInclude(mrk => mrk.Marker)
                                .ThenInclude(mrkProp => mrkProp.MarkersTranslations)
                                .ThenInclude(mrk => mrk.Marker)
                                .ThenInclude(mrkTp => mrkTp.Type)
                                .FirstOrDefaultAsync(t => t.Id == tourId);

所以每個Tour實體都有一組相關的Marker及其翻譯,但每個Marker也有一個Type

Microsoft Docs似乎批准了我用於此查詢的模式,以便包含多個級別。

現在哪個是使用 EF Core 6 獲得相同結果的正確方法?

有趣的是,EF 核心 6 的重大更改列表中沒有“不允許回退包含樹”的限制。

在只向前走樹的同時包含您想要的所有內容的方法是這樣的:

Tour tour = await _context.Tours
    .Include(tour => tour.MarkersPerTours)
        .ThenInclude(mpt => mpt.Marker)
            .ThenInclude(mrk => mrk.MarkersTranslations)
    .Include(tour => tour.MarkersPerTours)
        .ThenInclude(mpt => mpt.Marker)
            .ThenInclude(mrk => mrk.Type)
    .FirstOrDefaultAsync(t => t.Id == tourId);

順便說一句,我更改了范圍變量的名稱,IMO 更清晰,更傳統,讓名稱反映它們的類型,而不是它們要導航到的屬性。

配置警告以忽略它,如下所示

services.AddDbContext<YourContext>(options =>
        {
          
            options.ConfigureWarnings(warnings =>
                
            warnings.Ignore(CoreEventId.NavigationBaseIncludeIgnored));
        });

或者你可以在 Dbcontext 的OnConfiguring方法中添加類似的東西

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
        .ConfigureWarnings(warnings => warnings.Ignore(CoreEventId.NavigationBaseIncludeIgnored, CoreEventId.NavigationBaseIncluded));

暫無
暫無

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

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