带有子对象的父级的DbContext.Save抛出“检测到冲突的更改”

时间:2014-11-27 11:26:02

标签: c# entity-framework-6

我有一个父/子层次结构,我想在DbContext中插入一个新的父级,并让它自动保留子对象。这种关系是一对多的,每个父母可以在0或更多列。

但每当我调用DbContext.Save(父)时,我都会收到“检测到冲突的更改”。尝试使用相同的密钥插入多个实体时可能会发生这种情况。'。当我剥离子列的父级时,它会保存罚款,所以我假设这与没有设置主键的子对象有关。如何告诉EntityFramework正确保存我的层次结构?

我的课程:

public class ExcelTemplate
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int FirstDataRow { get; set; }
    public virtual ICollection<TemplateColumn> Columns { get; set; }

    public ExcelTemplate()
    {
        Columns = new List<TemplateColumn>();
    }
}

public class TemplateColumn
{
    public int Id { get; set; }
    public int Index { get; set; }
    public int MetricTypeId { get; set; }
    public virtual MetricType MetricType { get; set; }

    public int TemplateId { get; set; }
    public virtual ExcelTemplate Template { get; set; }
}

配置:

public class ExcelTemplateConfiguration : EntityTypeConfiguration<ExcelTemplate>
{
    public ExcelTemplateConfiguration()
    {
        HasKey(t => t.Id)
            .Property(t => t.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        Property(t => t.Name)
            .IsRequired();

        HasMany(t => t.Columns)
            .WithRequired(c => c.Template)
            .HasForeignKey(c => c.TemplateId);
    }
}

public class TemplateColumnConfiguration : EntityTypeConfiguration<TemplateColumn>
{
    public TemplateColumnConfiguration()
    {
        HasKey(c => c.Id)
            .Property(c => c.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        HasRequired(tpl => tpl.MetricType)
            .WithRequiredDependent();
    }
}

2 个答案:

答案 0 :(得分:0)

  1. ExcelTemplate.IdTemplateColumn.Id是否有身份规范?您是否正确设置了Id属性?

  2. 您是否将ExcelTemplate个对象的TemplateColumn属性设置为ExcelTemplate父级?

  3. 类似的东西:

    ExcelTemplate t = new ExcelTemplate();
    //init template code...skip
    
    TemplateColumn c = new TemplateColumn();
    //init template column code...skip
    c.ExcelTemplate = t;//this is the line I am asking if you are doing. 
    

答案 1 :(得分:0)

我通过反复试验发现了罪魁祸首,因为当我只尝试自己存储TemplateColumn时问题仍然存在。

问题是从TemplateColumn配置中删除这行代码,并让实体框架按惯例映射:

HasRequired(tpl => tpl.MetricType)
    .WithRequiredDependent();

知道为什么这不起作用?