当我尝试插入一个有另一个孩子替换的子实体时,我收到一条错误消息。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。 –