实体框架继承和持久化列

本文关键字:持久化 继承 框架 实体 | 更新日期: 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中的值,有人知道使其与实体框架一起工作的解决方案吗?

谢谢!

实体框架继承和持久化列

这个数据库模式有两个非常大的问题:

    派生表中的
  1. ProfileTypeId是计算列,因为父表中的ProfileTypeId也将作为计算列处理。EF不允许在主键中使用计算列。即使它允许他们,你的方案也不会奏效。您将无法插入CompanyPerson,因为EF从不将计算列的值发送到数据库。因此insert将违反外键,因为Profile总是将ProfileTypeId设置为null。
  2. EF不允许外键作为计算列。

结论:你不能在EF中映射这个

你必须摆脱ProfileTypeId和ProfileType,因为这些信息对EF来说是完全冗余的,或者你可以尝试在这些表的顶部建立一些视图,并将该视图映射为每层表(TPH),并使用存储过程或instead of触发器将数据插入到你的表中。