2012-09-12 49 views
0

我有一個更詳細的問題,我沒有回答,我會有一個更簡單的方法相同的問題:如何更新實體?

我有一個EF數據庫與外鍵到另一個表。 enter image description here

我想UPDATE實體。但我需要這個像這樣,我會寫下面的代碼:

  1. 轉到數據庫和檢索通過 ID的會員,返回EF成員對象
  2. 執行對象OUTSIDE上的一些變化EF上下文
  3. 發送修改 EF成員進入保存方法
  4. BL層保存方法使用上下文並保存更改。

1)

MemberManager currentMemberManager = new MemberManager(); 
Member NewMember = currentMemberManager.GetById(2); 

2)

NewMember.FirstName = "NewFirstName"; 
NewMember.LanguageId = 1; 

3)

currentMemberManager.Save(NewMember); 

4)

public void Save2(Member newMember) 
{ 
    using (var Context = new NoxonEntities()) 
    { 
     Member existingMember = Context.Member.First(c => c.Id == newMember.Id); 
     existingMember.FirstName = newMember.FirstName; 
     existingMember.Language = Context.Language.First(c => c.Id == newMember.LanguageId); 
     Context.SaveChanges();//In here I get the error below 
    } 
} 

對數據庫的更改已成功提交,但在更新對象上下文時發生了錯誤 。 ObjectContext可能是 處於不一致狀態。內部異常消息:參考 發生完整性約束衝突: 定義參照約束的屬性值在 關係中的主體和從屬對象之間不一致。

注意:您可以建議發送不同的類(例如:公共類 MyMember)具有所有必要的屬性,完全由EF分離 。但是,這需要很多工作才能將所有EF對象轉換成我的獨立課程 。我對嗎?

我希望有一種方法可以分離實體足夠長的時間來修改它並將值保存到數據庫中。 (另外,我嘗試了Detach方法,它根本不更新行)

我一直試圖解決這個問題,現在幾個小時。

請幫助我更好地理解它,我真的需要一個解決方案。非常感謝任何人有一些想法。

+0

是否與你的新成員上設置ID語言數據庫中存在嗎?如果沒有,您需要在保存更改之前將其添加到上下文中。 –

+0

是的。與語言ID相關的Id已經存在於語言表上了。所以沒有關係問題。 –

+0

而不是Context.Member.First,也許你可以嘗試使用Attach方法 – lgoncalves

回答

2

你可以做一些簡單的事情,如分離實體,然後將其附加到上下文,當你準備好保存?

MemberManager currentMemberManager = new MemberManager(); 
Member NewMember = currentMemberManager.GetById(2); 

的get:

public Member GetById(int id) 
{ 
    var member = YourContext.Members.FirstOrDefault(m => m.id == id); 
    YourContext.Detach(member); 
    return member; 
} 

保存:

public void Save2(Member newMember) 
     { 
      using (var Context = new NoxonEntities()) 
      { 
       Context.Attach(newMember); 
       Context.ObjectStateManager.ChangeObjectState(newMember, EntityState.Modified); 
       Context.SaveChanges(); 
      } 
     } 
+0

天啊!而已!實際上它!!非常感謝你Mark!我一直在爲這個問題而苦苦掙扎! 那麼,當您在會話中檢索一般用途的對象時,基本想法是從EF中DETACH? –

+0

正確 - 獲取實體,將其分離,以便您可以執行自己想要的操作,然後在重新掛接該實體以保存更改時。這可以防止你的上下文存在太久。 –

+0

使用分離和重新連接的實體時要小心,您可以並且會發現自己處於衝突中,併發編輯的方式如此。 (2個用戶編輯相同的數據)用戶1獲取一個對象並開始編輯一個分離的實例。用戶2也一樣。根據ORM行爲,您可能會獲得競爭條件(以勝利爲後)或版本不匹配錯誤。 (NHibernate,不知道EF)通常最好重新加載實體並檢查版本,然後將分離的實體(或視圖模型)中的值轉錄回「實時」實體。 –