实体框架继承和持久化列
本文关键字:持久化 继承 框架 实体 | 更新日期: 2023-09-27 17:48:56
由于继承,我在实体框架中遇到了一些问题。所以,我有这样的数据库:
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到PROFILETYPE中的FK。可能是因为在公司中ProfileTypeId是持久化的,它没有填充PROFILE中的值,有人知道使其与实体框架一起工作的解决方案吗?
谢谢!
这个数据库模式有两个非常大的问题:
- 派生表中的
-
ProfileTypeId
是计算列,因为父表中的ProfileTypeId
也将作为计算列处理。EF不允许在主键中使用计算列。即使它允许他们,你的方案也不会奏效。您将无法插入Company
或Person
,因为EF从不将计算列的值发送到数据库。因此insert将违反外键,因为Profile
总是将ProfileTypeId
设置为null。 - EF不允许外键作为计算列。
结论:你不能在EF中映射这个
你必须摆脱ProfileTypeId和ProfileType,因为这些信息对EF来说是完全冗余的,或者你可以尝试在这些表的顶部建立一些视图,并将该视图映射为每层表(TPH),并使用存储过程或instead of
触发器将数据插入到你的表中。