1

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

Person
   PersonID (PK)
   Name

Employee
   EmployeeID (PK)
   PersonID (FK)
   DateStarted

HourlyEmployee
   HourlyEmployeeID (PK)
   EmployeeID (FK)
   HourlyRate

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

4

2 回答 2

0

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

于 2012-07-17T18:14:59.137 回答
0

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

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

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

此类将告诉 EFEmployee从 Person ( ) 继承密钥,PersonID并且您将从 EF 隐藏真正的密钥 - 如果真正的密钥是自动生成的,这应该可以工作。

问题是您的下一级继承打破了这种模式。要完成这项工作,您HourlyEmployee将不得不参考PersonID- 不是EmployeeID。EF 现在不知道EmployeeID存在,所以它甚至无法映射关系HourlyEmployee

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

于 2012-07-17T18:30:35.253 回答