實體框架核心:僅在沒有額外調用的情況下更新與Id的關係

asp.net-core c# entity-framework-core orm relationship

我正在試圖弄清楚如何處理本文檔中描述的“單一導航屬性案例”

假設我們有2個型號。

class School
{
   public ICollection<Child> Childrens {get; set;}
   ...
}

class Child
{
    public int Id {get; set;}
    ...
}

因此,它是由約定創建的多對一關係,在Child沒有顯式外鍵。

所以問題是我們是否有Child實例並且知道School.Id是否有一種更新此關係的方法,而無需額外調用數據庫來獲取School實例。

熱門答案

所以問題是我們是否有Child實例並且知道School.Id是否有一種更新此關係的方法,而無需額外調用數據庫來獲取School實例。

是的,這是可能的。您可以創建一個假的存根 School與實體實例Id唯一, Attach它到DbContext (這樣講,它是現有的EF), AttachChild實例出於同樣的原因,然後添加Child以父集合和呼叫SaveChanges

Child child = ...;
var schoolId = ...;

var school = new School { Id = schoolId };
context.Attach(school);
context.Attach(child);
school.Childrens.Add(child);
context.SaveChanges();

更新:實際上還有另一種清潔方式,因為即使實體沒有導航或FK屬性,EF Core也允許您訪問/修改所謂的陰影屬性

陰影屬性是實體類中不存在的屬性。這些屬性的值和狀態僅在Change Tracker中維護。

一旦你知道這個名字。在您的情況下,沒有配置將按照慣例"SchoolId"

因此,不需要偽School實體實例,只需確保附加了Child ,然後通過ChangeTracker API簡單地設置shadow屬性:

context.Attach(child);
context.Entry(child).Property("SchoolId").CurrentValue = schoolId;
context.SaveChanges();


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow