问题在于,虽然我们已经修改了(使用表格每类映射),但孩子的PK是父母的关键。
public class Entity
{
[Key]
public Guid EntityId { get; set; }
}
public class VersionedEntity: Entity
{
public Guid VersionId { get; set; }
}
OnModelCreating包含:
modelBuilder.Entity<VersionedEntity>().Map(m =>
{
m.MapInheritedProperties();
});
modelBuilder.Entity<VersionedEntity>().HasKey(e => new { e.EntityId , e.HistoryId});
因此,我们将获得仍包含单列PK(EntityId)的VersionedEntity。
m.MapInheritedProperties()之后是否有可能替换/删除&#34;固有的&#34;父键映射?
答案 0 :(得分:0)
不,你没有。原因是EF对整个继承树有一个实体键定义。在我看来,它甚至应该为第二个HasKey
语句抛出一个错误,而不是默默地忽略它。
拥有一个实体密钥定义的原因是您可能(但可能不会)将所有实体公开一个DbSet<Entity>
。如果是这样,应该可以......
context.Entities.Find(Guid.Parse(someGuid));
如果一个子类型具有不同类型的密钥,则这是不可能的。
如果你需要坚持使用这个模型,你最好不要忘记基类,并分别映射每个类型,而不需要映射继承。在这种情况下,base EntityTypeConfiguration
可能会有所帮助。