2011-09-07 75 views
0

當我嘗試插入一個有另一個孩子替換的子實體時,我收到一條錯誤消息。EF 4.1:在插入父代之前替換一個子實體

下面是詳細信息:

我有一個一對多的關係,其中的子元素有時需要插入,它需要更新其他時間。這涉及使用EF 4.1的ASP.Net MVC 3項目。

下面是一個例子來說明我正在嘗試做什麼。比方說,我有這2個對象:

public class Foo { 
    [Key] 
    public int FooId { get; set; } 
    public int BarId { get; set; } 
    public Bar bar { get; set; } 
    public string type; 
} 

public class Bar { 
    [Key] 
    public int BarId { get; set; } 
    public string name; 
    public string email; 
} 

而且我有一個表格,以形成具有這3個fiels新富:

  1. 類型
  2. 名稱
  3. 電子郵件

現在,在保存Foo之前​​,我使用電子郵件字段檢查Bar是否已經存在於我的數據庫中,因爲我不想讓兩個條相同電子郵件。如果沒有給定的電子郵件的酒吧,一切都很好,我保存Foo,它會在數據庫中創建一個新的Foo和一個新的酒吧。但是,如果我在數據庫中找到現有的酒吧,我做到以下幾點:

existingBar.Name = myFoo.Bar.Name; //To update the name 
myFoo.Bar = existingBar;    //Replace the Bar that was going to be inserted with Foo by the existing one 
fooRepository.Add(myFoo); 
SaveFoo(); 

當我這樣做不過,我得到了以下錯誤消息:

操作失敗:這種關係可能不可更改,因爲 一個或多個外鍵屬性是不可空的。當 更改爲關係時,相關的外鍵屬性 設置爲空值。如果外鍵不支持空值,則必須定義一個新的關係,外鍵屬性必須爲 分配另一個非空值,或者無關對象必須爲 刪除。

我也試過這樣:

existingBar.Name = myFoo.Bar.Name; //To update the name 
ModelCopier.CopyModel(existingBar, myFoo.Bar); 
fooRepository.Add(myFoo); 
SaveFoo(); 

在這種情況下,我收到以下錯誤消息:

集合被修改;枚舉操作可能不會執行。

那麼,有沒有辦法將myFoo與現有的Bar一起保存爲子?

+0

「*我有一個一對多的關係,有時需要插入子元素,有時需要更新。」「從您的進一步描述中,我必須假設」Bar「是孩子。但是,如果在父'Foo'(一)和子(ren)'之間有一對多關係,那麼父'Foo'有單個引用和'Bar'的外鍵是沒有意義的。酒吧「(很多)。所以,對於這樣一個模型來說,這個例外也是非常奇怪的。你能讓你的關係更精確嗎? – Slauma

+0

@Slauma也許我的措辭是錯誤的,但我的意思是一個酒吧可以有很多Foos。 –

回答

0

您是否在修改後嘗試調用barRepository.update(existingBar)?然後嘗試添加新的Foo。

+0

謝謝傑克!你的建議讓我走上正軌。這將需要更多的測試以確保它工作正常,但是逐個複製字段而不是使用ModelCopier.CopyModel()並事先保存existingBar似乎是解決方案。 –

相關問題