由于继承,我在实体框架中遇到了一些问题。 所以,我有类似这个数据库的东西:
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中的值,是否有人知道一种解决方法,使其适用于实体框架?
谢谢!
答案 0 :(得分:0)
此数据库架构中存在两个非常大的问题:
ProfileTypeId
是计算列,因为父表中的ProfileTypeId
也将作为计算列处理。 EF不允许主键中的计算列。即使它允许他们你的场景也行不通。您将无法同时插入Company
或Person
,因为EF永远不会将计算列的值发送到数据库。因此,插入将违反外键,因为Profile
始终将ProfileTypeId
设置为null。结论:你不能在EF中映射它。
您必须要删除ProfileTypeId和ProfileType,因为该信息对于EF来说是完全冗余的,或者您可以尝试在这些表之上构建一些视图并将该视图映射为Table Per Hierarchy(TPH)并使用存储过程或{ {1}}触发器将数据插入表格。