Entity framework TPC映射:MapInheritedProperties()强制密钥继承

Entity framework TPC映射:MapInheritedProperties()强制密钥继承,entity-framework,inheritance,entity-framework-6,Entity Framework,Inheritance,Entity Framework 6,问题是child的PK是父级的键,尽管我们已经修改了(使用了每个类的表映射) OnModelCreating包含: modelBuilder.Entity<VersionedEntity>().Map(m => { m.MapInheritedProperties(); }); modelBuilder.Entity<VersionedEntity>().HasKey(e => new { e.EntityId , e.HistoryId}); mod

问题是child的PK是父级的键,尽管我们已经修改了(使用了每个类的表映射)

OnModelCreating包含:

modelBuilder.Entity<VersionedEntity>().Map(m =>
{
   m.MapInheritedProperties();
});
modelBuilder.Entity<VersionedEntity>().HasKey(e => new { e.EntityId , e.HistoryId});
modelBuilder.Entity().Map(m=>
{
m、 MapInheritedProperties();
});
modelBuilder.Entity().HasKey(e=>new{e.EntityId,e.HistoryId});
因此,我们将获得仍然包含一列PK(EntityId)的VersionIdentity


在m.MapInheritedProperties()替换/删除“固有的”父键映射之后,是否有可能

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

使用一个实体键定义的原因是您可能(但可能不)通过一个
DbSet
公开所有实体。如果是这样的话,应该可以做到

context.Entities.Find(Guid.Parse(someGuid));
如果一个子类型具有不同类型的键,则这是不可能的


如果您需要保留这个模型,那么最好让EF忽略基类,并单独映射每个类型,而不使用映射继承。在这种情况下,有一个新的解决方案可能会有所帮助。

谢谢。我同意你的回答,但不幸的是,我在你的解释中遗漏了一些重要的东西。我想保留一把钥匙,没有必要解释我为什么需要一把钥匙。但我感兴趣的是访问我们保存“键定义”的结构,并从该结构中删除“继承键”的可能性。好的,这有点不同。我猜从技术上讲,TPC继承中的两个类可能有不同的键字段名,只要字段的数量、顺序和类型完全匹配。EF不支持这一点。我无法想象具有可变字段数的键如何适合一个继承层次结构。这就是我搜索的内容:找到应该位于modelBuilder深处的“keys”数组,并删除一个与子实体(在MapInheritedProperties上创建)关联的键。然后我将能够创建新的密钥。这有意义吗?坦率地说,没有。EF应该总是能够通过相同的唯一键识别派生类的所有对象实例。如果您能够以某种方式添加第二个键属性,
EntityId
值可能会被复制,EF将抛出一个重复的键异常。你的案子就是没有执行。也许EF可以在TPC中比较每种类型的键值,但它不能。我只知道
HasKey(e=>new{e.EntityId,e.HistoryId})
context.Entities.Find(Guid.Parse(someGuid));