【发布时间】:2011-09-07 15:54:31
【问题描述】:
当我尝试插入一个实体,该实体的一个子代被另一个子代替换时,我收到一条错误消息。
以下是详细信息:
我有一个一对多的关系,有时需要插入子元素,有时需要更新它。这是关于使用 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 个字段的新 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?
【问题讨论】:
-
"我有一个一对多的关系,有时需要插入子元素,有时需要更新它。" 从你的进一步描述中,我必须假设
Bar是孩子。但是,如果父级Foo(一)和子级(任)@ 之间存在一对多关系,那么父级Foo具有单个引用和Bar的外键是没有意义的987654328@(很多)。因此,对于这样的模型,异常也是非常奇怪的。你能让你的关系更精确吗? -
@Slauma 也许我的措辞有误,但我的意思是 Bar 可以有很多 Foo。
标签: asp.net-mvc-3 entity-framework-4