簡體   English   中英

EF Core 5.0.4 - 從核心 3.1 升級后,通過 Include() 的急切加載不起作用

[英]EF Core 5.0.4 - Eager Loading via Include() does not work after upgrade from core 3.1

我們最近從 3.1 遷移到 .net 核心 5.0.4 並且 EF 急切加載已停止運行。 它不再加載依賴的 object。

我們嘗試像這樣加載依賴實體(但未加載相關的 Permissions obj):

var test = _db.Guardians.Include(x => x.Permissions).First(x => x.Id == id);

雖然 PermissionId Fk 已填充,但依賴實體不是: 在此處輸入圖像描述

除了遷移到 EF Core 5 之外,沒有其他變化。

POCO 以防萬一:

public class GuardianModel : PersonModel
{
    public int PermissionsId { get; set; }
    [ForeignKey("PermissionsId")]
    public virtual GuardianPermission Permissions { get; set; }

    public GuardianModel() : base()
    {
        Permissions = new GuardianPermission();
        Active = true;
    }
}
public class GuardianPermission
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public bool MessageAsEmail { get; set; }
    public bool Permission { get; set; }
    public bool Message { get; set; }
    public bool CovidReportEmail { get; set; }
    public bool PermissionEmails { get; set; }
    public bool System { get; set; }
    public GuardianPermission()
    {
        MessageAsEmail = true;
        Permission = true;
        Message = true;
        PermissionEmails = true;
    }
}

我已經嘗試了谷歌返回的每個答案,添加了明確的 FK 引用,FK 不再可以為空,刪除了虛擬關鍵字,沒有任何區別。

非常感謝任何指導/故障排除步驟。

好的,所以我發表我的評論作為答案:

EF Core 5.0 中的重大更改
“非空引用導航不會被查詢覆蓋”

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-5.0/break-changes#nonnullreferences

即,如果導航屬性不是null - 它不會由 EF 填充(空集合除外)。

來自文檔:

舊行為
在 EF Core 3.1 中,急切地初始化為非空值的引用導航有時會被數據庫中的實體實例覆蓋,無論鍵值是否匹配。 但是,在其他情況下,EF Core 3.1 會做相反的事情並保留現有的非空值。

新行為
從 EF Core 5.0 開始,非空引用導航永遠不會被查詢返回的實例覆蓋。

請注意,仍然支持將集合導航初始化為空集合。

根據@apocalypse 的建議,它與https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-5.0/break-changes#nonnullreferences中的重大更改有關:

查詢跟蹤問題 #2693 不會覆蓋非空引用導航

舊行為在 EF Core 3.1 中,急切地初始化為非空值的引用導航有時會被數據庫中的實體實例覆蓋,無論鍵值是否匹配。 但是,在其他情況下,EF Core 3.1 會做相反的事情並保留現有的非空值。

新行為 從 EF Core 5.0 開始,非空引用導航永遠不會被查詢返回的實例覆蓋。

請注意,仍然支持將集合導航初始化為空集合。

為什么將引用導航屬性初始化為“空”實體實例會導致不明確的 state。 例如:

C#

public class Blog
{
    public int Id { get; set; }
    public Author Author { get; set; ) = new Author();
}

通常,對 Blogs 和 Authors 的查詢將首先創建 Blog 實例,然后根據從數據庫返回的數據設置適當的 Author 實例。 但是,在這種情況下,每個 Blog.Author 屬性都已初始化為空的 Author。 除了 EF Core 沒有辦法知道這個實例是“空的”。 所以覆蓋這個實例可能會默默地丟棄一個有效的作者。 因此,EF Core 5.0 現在始終不會覆蓋已初始化的導航。

這種新行為在大多數情況下也與 EF6 的行為一致,盡管經過調查,我們也發現了 EF6 中的一些不一致情況。

緩解措施 如果遇到此中斷,則解決方法是停止急切地初始化參考導航屬性。

就我而言:

  public GuardianModel() : base()
{
    Permissions = **new GuardianPermission();**
    Active = true;
}

違規行在上面加粗。 我的解決方案是刪除默認初始化並確保在實例化主 class 之后實例化依賴的 class。 有沒有更好的辦法。 IE:

var g = new GuardianModel();
g.Permissions = new GuardianPermission();

必須有比必須找到所有上述實例更好的方法。

暫無
暫無

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

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