实体框架表每种类型继承PK-> FK,而不是PK-> PK

时间:2012-07-17 17:54:15

标签: entity-framework entity-framework-4.1

我必须为设计糟糕的数据库创建一个实体框架模型。数据库使用每种类型继承的表,但它使用PK-> FK关系,而不是PK-> PK关系。 E.g。

Person
   PersonID (PK)
   Name

Employee
   EmployeeID (PK)
   PersonID (FK)
   DateStarted

HourlyEmployee
   HourlyEmployeeID (PK)
   EmployeeID (FK)
   HourlyRate

显然这只是设计糟糕,但我无法改变它。实体框架中每类型继承的表本质上要求EmployeeID不存在,而Employee的PK为PersonID。是否可以为此数据库创建模型,还是选择其他工具?有什么建议吗?

2 个答案:

答案 0 :(得分:0)

如果模型存在,您可以从数据库创建模型,但它可能不是您所期望的。对于奇怪的数据库结构,EF有时不能很好地工作。

答案 1 :(得分:0)

您不会将此映射为TPT继承,因为您的数据库配置方式不允许您欺骗EF。

如果数据库中自动生成Employee.EmployeeID并且Employee.PersonID是唯一的(必须在数据库中强制执行),您应该能够(未经测试)通过简单映射来欺骗EF:

public Employee : Person {
    public DateTime DateStarted { get; set; }
}

此类将告诉EF Employee从Person(PersonID)继承密钥,并且您将隐藏EF中的真实密钥 - 如果真实密钥是自动生成的,这应该有效。

问题是你的下一级继承会破坏这种模式。为了完成这项工作,您的HourlyEmployee必须引用PersonID - 而不是EmployeeID。 EF现在不了解EmployeeID存在,因此它甚至无法将关系映射到HourlyEmployee

代码中的TPT继承首先有一个额外的限制 - PK列在所有表中必须具有相同的名称。