我有一个父/子层次结构,我想在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();
}
}
答案 0 :(得分:0)
ExcelTemplate.Id
和TemplateColumn.Id
是否有身份规范?您是否正确设置了Id
属性?
您是否将ExcelTemplate
个对象的TemplateColumn
属性设置为ExcelTemplate
父级?
类似的东西:
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();
知道为什么这不起作用?