这是这个问题的扩展,据我所知,它现在在 EF6 中有效。但是,当您拥有同时具有共享和非共享属性的子类时,似乎存在问题。
假设这是我的模型设置:
public abstract class Document
{
public int Id { get; set; }
public string NameOnDocument { get; set; }
}
public class BirthCertificate : Document
{
public string RegistrationNumber { get; set; }
}
public class Licence : Document
{
public string LicenceNumber { get; set; }
}
在数据库中,我想BirthCertificate.RegistrationNumber
和Licence.LicenceNumber
共享同一列,Number
. 因此,我正在像这样设置我的模型:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Document - base class
modelBuilder.Entity<Document>().HasKey(d => d.Id);
modelBuilder.Entity<Document>()
.Property(d => d.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Document>()
.Property(d => d.NameOnDocument)
.HasColumnName("Name");
// Birth certificate
modelBuilder.Entity<Document>().Map<BirthCertificate>(map =>
map.Property(c => c.RegistrationNumber).HasColumnName("Number"));
// Licence
modelBuilder.Entity<Document>().Map<Licence>(map =>
map.Property(l => l.LicenceNumber).HasColumnName("Number"));
}
当我生成数据库时,它看起来和工作正常:
现在讨论手头的问题。假设Licence
实体还需要记录到期日;所以我添加如下:
public class Licence : Document
{
public string LicenceNumber { get; set; }
public DateTime ExpiryDate { get; set; }
}
现在,当我重新生成数据库时,它看起来像这样:
更重要的是,如果我尝试插入许可证和出生证明,我会得到以下异常:
EntityFramework.dll 中出现“System.Data.Entity.Infrastructure.DbUpdateException”类型的未处理异常
附加信息:跨实体或关联共享的值在多个位置生成。检查映射是否不会将 EntityKey 拆分为多个存储生成的列。
我可以理解为什么会引发该异常-因为数据库没用。
我错过了什么?