【发布时间】:2014-11-13 03:31:41
【问题描述】:
这是this question 的扩展,据我所知,它现在可以在 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 拆分为多个存储生成的列。
我可以理解为什么会引发该异常 - 因为数据库没用。
我错过了什么?
【问题讨论】:
标签: c# sql-server entity-framework entity-framework-6 table-per-hierarchy