2011-09-07 71 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似乎是解决方案。 –

相关问题