TPC映射:MapInheritedProperties()强制键继承

时间:2015-02-06 18:58:44

标签: entity-framework inheritance entity-framework-6

问题在于,虽然我们已经修改了(使用表格每类映射),但孩子的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;父键映射?

1 个答案:

答案 0 :(得分:0)

不,你没有。原因是EF对整个继承树有一个实体键定义。在我看来,它甚至应该为第二个HasKey语句抛出一个错误,而不是默默地忽略它。

拥有一个实体密钥定义的原因是您可能(但可能不会)将所有实体公开一个DbSet<Entity>。如果是这样,应该可以......

context.Entities.Find(Guid.Parse(someGuid));

如果一个子类型具有不同类型的密钥,则这是不可能的。

如果你需要坚持使用这个模型,你最好不要忘记基类,并分别映射每个类型,而不需要映射继承。在这种情况下,base EntityTypeConfiguration可能会有所帮助。