當我嘗試插入一個有另一個孩子替換的子實體時,我收到一條錯誤消息。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新富:
- 類型
- 名稱
- 電子郵件
現在,在保存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一起保存爲子?
「*我有一個一對多的關係,有時需要插入子元素,有時需要更新。」「從您的進一步描述中,我必須假設」Bar「是孩子。但是,如果在父'Foo'(一)和子(ren)'之間有一對多關係,那麼父'Foo'有單個引用和'Bar'的外鍵是沒有意義的。酒吧「(很多)。所以,對於這樣一個模型來說,這個例外也是非常奇怪的。你能讓你的關係更精確嗎? – Slauma
@Slauma也許我的措辭是錯誤的,但我的意思是一個酒吧可以有很多Foos。 –