簡體   English   中英

EF Core 不會根據關系屬性進行更新

[英]EF Core does not update based on the relation property

我對更新 model 的 EF Core 一般行為有疑問。 我有以下 model 類:

public class Province
{
     public int Id { get; set; }
     public string Name { get; set; }
}

public class City
{
     public int Id { get; set; }
     public string Name { get; set; }
     public int? ProvinceId { get; set; }
     public virtual Province Province { get; set; }
}

當我在 UI 中獲取要編輯的City時,我包含了Province ,因此 UI 可以完美地顯示 model。 現在用戶想要將Province更改為City

當用戶更改Province下拉列表時, City model 的ProvinceId ID 會發生變化,但Province object 保持不變。

因此,當我將 model 發送到后端時,EF Core 不會更新 model。

示例 - 原始 model:

City: { Id: 1, Name: "City1", ProvinceId: 1, Province: { Id: 1, Name: "Province1" } }

在 UI 中更改了 model:

City: {Id: 1, Name: "City1", ProvinceId: 2, Province: { Id: 1, Name: "Province1" } }

我希望 EF Core 將ProvinceId更新為2 ,但事實並非如此,因為Province屬性仍然是舊屬性,除非我將Province屬性設置為null ,否則將無法正確應用更改。

有什么方法可以改變 EF Core 的這種行為,所以它會根據關系屬性更新 model 嗎?

我正在使用 EF Core 5.0。

有什么方法可以改變 EF Core 的這種行為,所以它會根據關系屬性更新 model 嗎?

它已經在這樣做了。 在 model 級別關系由引用/導航定義。 你發送了一個相關的Province ,EF 就根據它更新了City

您應該注意到您發送的City數據的不一致 - 它的ProvinceId值為 2,但是您擁有Id 1 的相關Province 。當 EF 在 model 級別(在SaveChanges之前)更新City實體的值時,它會設置所有數據屬性, ProvinceId的值設置為 2。但是,當它設置Province引用時, ProvinceId值更新為 1。所以這就是調用SaveChanges()時發送到數據庫的值。

要更新父引用,只需發送外鍵屬性,並避免引用本身 -

City: {Id: 1, Name: "City1", ProvinceId: 2 }

如果由於任何原因無法做到這一點,請在更新City之前將Province引用設置為 null 。

可能會跟隨重塑的 model 類對你有用!

public partial class Province
{
    public Province()
    {
        City = new HashSet<City>();            
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<City> City { get; set; }       
}   

public partial class City
{        
    public int Id { get; set; }
    public string Name{ get; set; }
    public int? ProvinceId{ get; set; }
    public virtual Province ProvinceNavigation { get; set; }       
}

暫無
暫無

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

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