2012-07-10 42 views
1

我试图让两个表之间的实体框架继承。实体框架:父和子主键的同名继承

父:

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”的子表:

enter image description here

而且的child1表映射如下:

enter image description here

但当我“验证”模型,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). 

基本上,我明白,E实体框架看到一个问题,我们将表的主键映射到一个属性,而不是实体的关键,但我们该如何使用继承?

只有在“Child”表中没有主键时才允许IS继承?我应该但我的主键为“简单键”?

在此先感谢...

+0

hmm ... Parent.ID - >主键,ok和Child.Cid?那是什么?为什么你需要另一个ID?当你通过EF生成db时,你会得到2个表;父(Id,CustomAttribute)和Parent_Child1(Id [与Parent.Id相同],SomeInformation)。其中一个好处是,如果你有不止一个来自Parent的继承,你可以通过_entities.Parent.TypeOf .SingleOrDefault(s ....) – davee 2012-07-10 14:34:09

+0

轻松访问。在我的数据库架构中,子表中的“Id”并且在父表中的目标不是相同的。从孩子到父母的FK被称为“TCId”。我没有从EF生成DB。我从DB生成EF。 – Undo 2012-07-10 15:38:23

+0

我编辑过这个模型,现在清楚了!每个表只能有一个主键,并且因为Child1是子项,所以它已经有一个主键(Parent.Id),除了您创建[复合主键](http://weblogs.sqlteam.com/jeffs /archive/2007/08/23/composite_primary_keys.aspx) – davee 2012-07-10 17:11:42

回答

1

EF希望孩子的Id PK也成为FK父。所以Child.Id既是PK又是FK。

+0

Child.Id是不是FK父母,FK父母是TCID ...也许你没有看到我的编辑。 – Undo 2012-07-10 15:36:38

+0

@Undo:好的,我没有看到您的编辑,因为您在我回答一个小时后才做出编辑。但是:您可能需要重新阅读答案。我向你展示了哪些方法可行。我明白你在尝试什么,但这种方式不起作用。 – 2012-07-10 16:51:04

+0

我不会说“不起作用”,但更多“EF无法处理这种情况[尚未?]”......这种框架的局限性。 (我发现至少有另一个btw - 为多对一或零关系加入表) – Undo 2012-08-01 13:23:37