【问题标题】:Entity Framework's TPC mapping results in errorEntity Framework 的 TPC 映射导致错误
【发布时间】:2014-02-25 05:28:05
【问题描述】:

我有这些模型:

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; }
}

在数据库中,我有两个名为TeachersStudents 的表。我想使用实体框架的 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 之前确保键值是唯一的。

这里有什么问题?

【问题讨论】:

  • 我知道,但我不能说。

标签: c# entity-framework-5


【解决方案1】:

看到这个link

我们得到这个异常的原因是因为 DbContext.SaveChanges() 内部调用其内部 ObjectContext 的 SaveChanges 方法。 ObjectContext 的 SaveChanges 方法默认调用 AcceptAllChanges 执行数据库修改后。

AcceptAllChanges 方法只是遍历所有条目 ObjectStateManager 并对它们中的每一个调用 AcceptChanges。自从 实体处于已添加状态,AcceptChanges 方法替换它们 具有基于主键的常规 EntityKey 的临时 EntityKey 从数据库返回的值(即 PersonId )和 这就是问题发生的地方,因为这两个实体都已经 由数据库为其主键分配相同的值(即 PersonId = 1),问题是 ObjectStateManager 无法跟踪相同类型的对象 因此它抛出相同的 EntityKey 值。如果你仔细看看 上面 TPC 的 SQL 模式,你会明白为什么数据库生成的一样 主键的值:两者中的 PersonId 列 学生和教师表已被标记为身份。

试试这个:

public srting PersonId { get; set; }

并将您的配置更改为:

   modelBuilder.Entity<Person>()
        .Property(i => i.PersonId)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

把你的班级改成abstract/

【讨论】:

  • 那么,我们使用TPC的时候是没有办法使用DatabaseGeneratedOption,Identity的吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多