在實體框架中抑制子物件持久化
在實體框架中,通常假設保存實體會自動將其子物件持久化為出色地。然而,在某些情況下,可能需要阻止這種行為。這在處理可能不直接對應於資料庫模式的扁平資料時特別有用。
讓我們考慮一個假設場景,其中 School 實體包含 City 屬性。當從平面檔案填入 School 物件時,City 屬性可以引用查找表來確定地理位置。但是,由於這些城市定義已經存在於資料庫中,因此實體框架在保存學校時無需再次插入它們。
為了防止實體框架在這種情況下持久保留子對象,有兩種方法:
方法1:使用EntityState
一種方法涉及手動設定子級的EntityState反對不變。這指示實體框架在儲存作業期間忽略子物件。以下是範例:
using (var context = new DatabaseContext()) { context.Set<School>().Add(newItem); // Set the City property to Unchanged context.Entry(newItem.City).State = EntityState.Unchanged; context.SaveChanges(); }
方法 2:使用外鍵
更優雅、更靈活的方法是在實體定義中使用外鍵屬性。在子屬性上定義外鍵屬性以明確指定其與外部實體的關係。例如:
public class School { [ForeignKey("City_Id")] public City City { get; set; } [Required] public int City_Id { get; set; } }
這種方法允許您在物件建立期間明確指定外鍵值,通知實體框架子物件已經持久化。透過在儲存時將City 屬性設為null,可以從上下文圖中省略City 屬性:
newItem.City = null; context.Set<School>().Add(newItem); context.SaveChanges();
透過採用這兩種方法之一,您可以阻止實體框架嘗試儲存子對象,確保只有所需的實體被持久化到資料庫中。
以上是如何防止實體框架持久化子物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!