我有这样的模型:
public class Person
{
public int PersonId { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class Student : Person
{
public int Payment { get; set; }
}
public class Teacher : Person
{
public int Wage { get; set; }
}在数据库中,我有两个表,名为Teachers和Students。我想使用实体框架的TPC映射。我的上下文课是:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.Property(i => i.PersonId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Teacher>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Teacher", "dbo");
});
modelBuilder.Entity<Student>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Student", "dbo");
});
}但是当我想要增加一位老师时,我会遇到这样的错误:
数据库的更改已成功提交,但在更新对象上下文时发生了错误。ObjectContext可能处于不一致的状态。内部异常消息: AcceptChanges不能继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,确保键值是唯一的。
这里怎么了?
发布于 2014-02-01 14:03:51
参见此链接
我们获得此异常的原因是DbContext.SaveChanges()内部调用其内部ObjectContext的SaveChanges方法。ObjectContext的SaveChanges方法在执行数据库修改后默认调用AcceptAllChanges。 AcceptAllChanges方法只是对ObjectStateManager中的所有条目进行迭代,并对每个条目调用AcceptChanges。由于实体处于添加状态,因此AcceptChanges方法将它们的临时EntityKey替换为基于从数据库返回的主键值(即PersonId )的常规EntityKey,而这正是问题发生的原因,因为两个实体都被数据库为其主键分配了相同的值(即在PersonId =1上),问题是ObjectStateManager无法用相同的EntityKey值跟踪相同类型的对象,因此会抛出。如果您仔细查看上面的TPC的schema,您将看到为什么数据库为主键生成了相同的值:“学生”和“教师”表中的PersonId列被标记为identity。
试试这个:
public srting PersonId { get; set; }并将配置更改为:
modelBuilder.Entity<Person>()
.Property(i => i.PersonId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);并将类更改为abstract/
https://stackoverflow.com/questions/21498368
复制相似问题