首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架的TPC映射导致错误

实体框架的TPC映射导致错误
EN

Stack Overflow用户
提问于 2014-02-01 13:00:58
回答 1查看 191关注 0票数 0

我有这样的模型:

代码语言:javascript
复制
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映射。我的上下文课是:

代码语言:javascript
复制
    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之前,确保键值是唯一的。

这里怎么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。

试试这个:

代码语言:javascript
复制
public srting PersonId { get; set; }

并将配置更改为:

代码语言:javascript
复制
   modelBuilder.Entity<Person>()
        .Property(i => i.PersonId)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

并将类更改为abstract/

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21498368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档