实体框架继承和持久列

时间:2011-04-03 21:16:17

标签: c# entity-framework inheritance

由于继承,我在实体框架中遇到了一些问题。 所以,我有类似这个数据库的东西:

PROFILE
Id int identity [PK]
ProfileTypeId int [FK] [PK]

PROFILETYPE
Id int [PK]

COMPANY
ProfileId int [FK] [PK]
ProfileTypeId AS 1 PERSISTED [FK] [PK]

PERSON
ProfileId int [FK] [PK]
ProfileTypeId AS 2 PERSISTED [FK] [PK]

我想实现继承,PROFILE可以是COMPANY或PERSON,它是独占的,所以COMPANY中的FK是ProfileId,ProfileTypeId是PROFILE,以使其独占。

但是当我尝试在实体框架中创建公司时,它违反了PROFILE中的FK到PROFILETYPE。可能是因为在COMPANY中,ProfileTypeId是持久化的,它没有填充PROFILE中的值,是否有人知道一种解决方法,使其适用于实体框架?

谢谢!

1 个答案:

答案 0 :(得分:0)

此数据库架构中存在两个非常大的问题:

    派生表中的
  1. ProfileTypeId是计算列,因为父表中的ProfileTypeId也将作为计算列处理。 EF不允许主键中的计算列。即使它允许他们你的场景也行不通。您将无法同时插入CompanyPerson,因为EF永远不会将计算列的值发送到数据库。因此,插入将违反外键,因为Profile始终将ProfileTypeId设置为null。
  2. EF不允许外键成为计算列。
  3. 结论:你不能在EF中映射它。

    您必须要删除ProfileTypeId和ProfileType,因为该信息对于EF来说是完全冗余的,或者您可以尝试在这些表之上构建一些视图并将该视图映射为Table Per Hierarchy(TPH)并使用存储过程或{ {1}}触发器将数据插入表格。