[英]Entity Framework 4.1 - default EntityState for a FK?
我在使用ASP.NET MVC和Entity Framework 4時遇到了一個小問題。我有一個名為“ UF”的實體和另一個名為“ Pais”的實體,並且它們具有以下關系:
UF [* ... 0..1] Pais
我可以使用導航屬性直接從UF訪問Pais對象:
UF.Pais.Whatever = "foobar";
當前,我有一個將新項目插入數據庫的視圖,並且它具有“ Pais.Codigo”的編輯器(“ Codigo”是Pais的主鍵)。 因此,當我插入一個新的UF時,框架將創建一個UF類的實例,並引用一個Pais類的實例。 然后完成:
if (ModelState.IsValid)
{
db.UFs.AddObject(uf);
db.SaveChanges();
return View();
}
問題在於EF將新的Pais插入數據庫中,因此它基本上忽略了現有的Pais。
例如,假設我的對象UF的ID為1的Pais。uf.Pais.Codigo的當前值為1。其他屬性(如描述)當前為null。 當我執行SaveChanges時,“ uf”和“ uf.Pais”都處於“已添加”狀態。 “ uf.Pais”的正確狀態應該保持不變,因為它已經存在於數據庫中。
我的問題是:有某種方法可以將默認關系EntityState更改為Unchanged? 以下代碼解決了該問題,但是將其添加到每個函數中並向數據庫(以及每個FK)添加新條目實在是太過分了!
db.ObjectStateManager.ChangeObjectState(uf.Pais, EntityState.Unchanged);
而已。 我不確定我是否足夠清楚。 如有需要,隨時詢問更多信息。 對於任何英語錯誤,我們深表歉意!
謝謝,
里卡多
我的問題是:有某種方法可以更改默認關系
EntityState
的Unchanged
嗎?
是的,通過調用Attach而不是Unchanged
。
以下代碼解決了該問題,但是將其添加到每個函數中並向數據庫(以及每個FK)添加新條目實在是太過分了!
不,這不是矯over過正,它是一種解決方案,因為Attach
或AddObject
始終對實體圖中的所有實體和關聯進行操作。 這意味着調用AddObject
將使上下文尚不知道的所有內容變為已Added
而Attach
將使上下文尚不知道的所有內容變為Unchanged
(因此,您必須將每個修改或插入的實體設置為正確的狀態)。 如果使用分離的實體,EF就是這樣工作的。
解決該問題的另一種方法是在添加UF
之后進行連接:
// Here UF.Pais is null
db.UFs.AddObject(uf);
// Create dummy Pais
var pais = new Pais { Id = "Codigo" };
// Make context aware of Pais
db.Pais.Attach(pais);
// Now make the relation
uf.Pais = pais;
db.SaveChanges();
如果您使用的是分離的實體,則始終要負責為每個實體 (和獨立的關聯 )設置正確的狀態 。 因此,您將使用附加的實體讓EF為您創造魔力(如示例中所示),或者您將使用自己不喜歡的方法。 在更復雜的場景中,您會發現最好的方法是再次加載實體圖,並將傳入的更改合並到附件圖中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.