【问题标题】:EF6 Conflicting changes detected on save保存时检测到 EF6 冲突更改
【发布时间】:2015-05-09 02:01:34
【问题描述】:

我有一个父/子层次结构,我想将新的父级插入 DbContext 并让它自动持久化子对象。

每次我在 DbContext EF 上的所有 SaveChanges 都会抛出一个异常

检测到有冲突的更改。尝试插入时可能会发生这种情况 具有相同键的多个实体。

我理解这个错误,因为子对象没有标识列。

型号如下:

public class Parent
{
     public int ParentId { get; set; }
     public string Name { get; set; }
     public ICollection<Child> Children { get; set; }
}

public class Child
{
     public int ParentId { get; set; }
     public virtual Parent Parent { get; set; }
     public string Name { get; set; }
}

以下子对象的映射::

public class ChildMap : EntityTypeConfiguration<Child>
{
   this.HasKey(p => p.ParentId);
   this.Property(p => p.ParentId)
       .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

   this.HasRequired(t => t.Parent)
       .WithMany(t => t.Children)
       .HasForeignKey(d => d.ParentId);
}

模型是使用 EF Power 工具生成的,因为我们遵循 DB-First 设计。

有没有办法保存图表而不是先保存父项然后保存子项?

【问题讨论】:

  • 你定义了主键吗?
  • 如果一个父节点可以有多个子节点,则不能以 ParentId 作为主键。
  • 主键是外键(ParentId)。虽然没有身份列
  • 您不能有多个具有相同主键的孩子。它必须是独一无二的。这就是你有冲突的原因。
  • 你错过了什么?我也有同样的问题,你的回答也无济于事。

标签: c# entity-framework


【解决方案1】:

我有一个类似的问题,通过从模型中删除不必要的 FK 关联得到了解决。出于某种原因,在从数据库更新模型时,这些并没有被删除。

为此,我只需在实体设计器中找到关联,将其删除,然后从数据库中重新更新模型。

这也可能是由于在特定列上存在无效的关系多重性,即 0..1 - 1 关系,而不是 * - 1。在模型浏览器下创建一个新的实体图并添加您的表调查(及其相关表格),您将能够轻松查看(和更改)多重性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多