【问题标题】:EF 4.1: Replacing a child entity before inserting the parentEF 4.1:在插入父实体之前替换子实体
【发布时间】: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:

  1. 键入
  2. 姓名
  3. 电子邮件

现在,在保存 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


【解决方案1】:

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

【讨论】:

  • 谢谢杰克!你的建议让我走上了正轨。这将需要更多测试以确保它工作正常,但是一个一个地复制字段而不是使用 ModelCopier.CopyModel() 并预先保存 existingBar 似乎是解决方案。
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 2021-06-09
  • 2020-04-09
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多