簡體   English   中英

實體框架4.1-FK的默認EntityState?

[英]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);

而已。 我不確定我是否足夠清楚。 如有需要,隨時詢問更多信息。 對於任何英語錯誤,我們深表歉意!

謝謝,

里卡多

我的問題是:有某種方法可以更改默認關系EntityStateUnchanged嗎?

是的,通過調用Attach而不是Unchanged

以下代碼解決了該問題,但是將其添加到每個函數中並向數據庫(以及每個FK)添加新條目實在是太過分了!

不,這不是矯over過正,它是一種解決方案,因為AttachAddObject始終對實體圖中的所有實體和關聯進行操作。 這意味着調用AddObject將使上下文尚不知道的所有內容變為已AddedAttach將使上下文尚不知道的所有內容變為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.

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