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 );?时正确地忽略/处理专业?
从异常消息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)
这将使用表中的非可空tinyint列Type,该列_AUDIT具有0基Audit类型对象的值1和派生UserAudit类型对象的值.