我必须为设计糟糕的数据库创建一个实体框架模型。数据库使用每种类型继承的表,但它使用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。是否可以为此数据库创建模型,还是选择其他工具?有什么建议吗?
答案 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列在所有表中必须具有相同的名称。