C# 实体框架:父子主键同名继承

C# 实体框架:父子主键同名继承,c#,entity-framework,inheritance,C#,Entity Framework,Inheritance,我试图在两个表之间进行实体框架继承 家长: ParentTable Id: int primary key CustomAttribute: int 孩子: ChilTable Id: int primary key (not the same one as the parent, Child specific Id) TCId: int foreign key to parent SomeInformation: String 出于某些原因,我希望继续将“Id”命名为P

我试图在两个表之间进行实体框架继承

家长:

ParentTable
  Id: int primary key
  CustomAttribute: int
孩子:

ChilTable
  Id: int primary key (not the same one as the parent, Child specific Id)
  TCId: int foreign key to parent
  SomeInformation: String
出于某些原因,我希望继续将“Id”命名为ParentTable和ChildTable的主键。这不应该打扰EntityFramwork,因为我为子表创建了另一个名为“CId”的自定义属性:

Child1表映射如下所示:

但当我“验证”模型时,VS2010说…:

Error 3002: Problem in mapping fragments starting at line 103:Potential runtime violation of table Child1's keys (Child1.Id): Columns (Child1.Id) are mapped to EntitySet Parents's properties (Parents.CId) on the conceptual side but they do not form the EntitySet's key properties (Parents.Id).
基本上,我理解实体框架看到了一个问题,即我们将表的主键映射到一个不是实体键的属性,但是我们应该如何使用继承

仅当“子”表中没有主键时才允许继承吗?我应该将主键改为“简单键”吗


先谢谢你

EF期望孩子的
Id
PK对父母来说也是FK。因此
Child.Id
既是PK又是FK。

EF期望孩子的
Id
PK对父母来说也是FK。所以
Child.Id
既是PK又是FK。

hmm。。。Parent.ID->Primary Key,ok,和Child.Cid?那是什么?你为什么需要另一个身份证?当您通过EF生成db时,您将得到2个表;父项(Id,CustomAttribute)和父项\u Child1(Id[与Parent.Id相同],SomeInformation)。其中一个优点是,如果您从父级继承了多个继承,则可以使用_entities.Parent.TypeOf.SingleOrDefault(s…)轻松访问my DB schema中的子表和父表中的“Id”并不相同。从子节点到父节点的FK称为“TCId”。我不是从EF生成DB。我正在从DB生成EF。你已经编辑了模型,现在它清晰了!每个表只能有一个主键,因为Child1是一个子表,所以它已经有一个主键(Parent.Id),除非您创建我实际上只有一个主键。我希望它是Id(Child.Id),而不是TCId(reflection/FK to Parent.Id)。我不明白为什么EF希望子表的主键也是父表PK的FK。从DB设计角度来看,这没有任何意义…嗯。。。Parent.ID->Primary Key,ok,和Child.Cid?那是什么?你为什么需要另一个身份证?当您通过EF生成db时,您将得到2个表;父项(Id,CustomAttribute)和父项\u Child1(Id[与Parent.Id相同],SomeInformation)。其中一个优点是,如果您从父级继承了多个继承,则可以使用_entities.Parent.TypeOf.SingleOrDefault(s…)轻松访问my DB schema中的子表和父表中的“Id”并不相同。从子节点到父节点的FK称为“TCId”。我不是从EF生成DB。我正在从DB生成EF。你已经编辑了模型,现在它清晰了!每个表只能有一个主键,因为Child1是一个子表,所以它已经有一个主键(Parent.Id),除非您创建我实际上只有一个主键。我希望它是Id(Child.Id),而不是TCId(reflection/FK to Parent.Id)。我不明白为什么EF希望子表的主键也是父表PK的FK。从DB设计PoV来看,没有任何意义…Child.Id对于父项不是FK,对于父项的FK是TCId。。。也许你没有看到我的编辑。@Undo:嗯,我没有看到你的编辑,因为你在我回答一小时后才看到。但是:您可能需要重新阅读答案。我向你展示了工作的方式。我理解你在尝试什么,但这种方式不起作用。我不会说“不起作用”,但更多的是“英孚无法处理这个案子(还?)。”。。。框架的一种限制。(我发现至少有另一个一对一或零关系的一个btw-联接表…)Child.Id不是父级的FK,父级的FK是TCId。。。也许你没有看到我的编辑。@Undo:嗯,我没有看到你的编辑,因为你在我回答一小时后才看到。但是:您可能需要重新阅读答案。我向你展示了工作的方式。我理解你在尝试什么,但这种方式不起作用。我不会说“不起作用”,但更多的是“英孚无法处理这个案子(还?)。”。。。框架的一种限制。(我找到了至少另一个多对一或零关系的一个btw-join表…)