实体框架 - TPH的鉴别器问题

jen*_*ent 1 mapping inheritance entity-framework-4.1

Invalid column name 'Discriminator'在保存记录的同时得到了.(代码优先,EF4.1)

我有一个我希望通过EF跟踪的实体:

public class Audit
 public virtual string p1
 public virtual string p2
Run Code Online (Sandbox Code Playgroud)

我有一个专门的UserAudit,它没有添加任何新的虚拟属性,它只是为审计设置了基础

public class UserAudit : Audit
 public UserAudit() { p1 = someval; }
Run Code Online (Sandbox Code Playgroud)

和配置:

public class AuditConfiguration : EntityTypeConfiguration<Audit>
  {
    public AuditConfiguration()
    {
      ToTable("_AUDIT");
      HasKey(c => c.Id);
      Property(c => c.Id).HasColumnName("AUDIT_ID");
    }
  }
Run Code Online (Sandbox Code Playgroud)

回购:

public class AuditRepository : IAuditRepository
  {
    public void LogAudit(Audit audit)
    {
      using (var db = new AuditContext())
      {
        db.Audits.Add(audit);
        db.SaveChanges();
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

我需要做些什么来告诉EF在我repo.LogAudit( userAudit );?时正确地忽略/处理专业?

Sla*_*uma 5

从异常消息Invalid column name 'Discriminator'我得出结论,你没有让EF 4.1创建数据库表,_AUDIT因为否则EF会创建一个调用Discriminator该表的列.也许你有一个没有这样一列的现有数据库表.当EF试图保存实体时,它想要存储一个表示您要保存到鉴别器列中的具体类型的值 - 但该列不存在.因此例外.

编辑

所以,你需要一个鉴别器专栏.您可以定义自己的自定义鉴别器列,如下所示:

public class AuditConfiguration : EntityTypeConfiguration<Audit>
{
    public AuditConfiguration()
    {
        ToTable("_AUDIT");
        HasKey(c => c.Id);
        Property(c => c.Id).HasColumnName("AUDIT_ID");

        Map<Audit>(m => m.Requires("Type").HasValue<byte>(0).IsRequired());
        Map<UserAudit>(m => m.Requires("Type").HasValue<byte>(1).IsRequired());
    }
}
Run Code Online (Sandbox Code Playgroud)

这将使用表中的非可空tinyintType,该列_AUDIT具有0Audit类型对象的值1和派生UserAudit类型对象的值.