当我尝试插入一个有另一个孩子替换的孩子的实体时,我收到一条错误消息。
以下是详细信息:
我有一对多关系,其中有时需要插入子元素,有时需要更新子元素。这涉及使用EF 4.1的ASP.Net MVC 3项目。
这是一个例子来说明我想要做的事情。假设我有这两个对象:
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:
现在,在保存Foo之前,我使用电子邮件字段检查我的数据库中是否已经存在Bar,因为我不想让两个Bars使用相同的电子邮件。如果没有给定电子邮件的Bar,一切都很好,我保存了Foo,它在数据库中创建了一个新的Foo和一个新的Bar。但是,如果我在数据库中找到现有的Bar,我会执行以下操作:
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();
在这种情况下,我收到以下错误消息:
收藏被修改;枚举操作可能无法执行。
那么,有没有办法用现有的Bar作为孩子保存myFoo?
答案 0 :(得分:0)
您是否尝试在修改后调用barRepository.update(existingBar)?然后尝试添加新的Foo。