EF 4.1:在插入父实体之前替换子实体

时间:2011-09-07 15:54:32

标签: asp.net-mvc-3 entity-framework-4

当我尝试插入一个有另一个孩子替换的孩子的实体时,我收到一条错误消息。

以下是详细信息:

我有一对多关系,其中有时需要插入子元素,有时需要更新子元素。这涉及使用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:

  1. 输入
  2. 姓名
  3. 电子邮件
  4. 现在,在保存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?

1 个答案:

答案 0 :(得分:0)

您是否尝试在修改后调用barRepository.update(existingBar)?然后尝试添加新的Foo。