2012-07-17 64 views
1

我必須爲設計不良的數據庫創建實體框架模型。數據庫使用每個類型繼承的表,但是它使用PK-> FK關係,而不是PK-> PK關係。例如。實體框架表每種類型繼承PK-> FK,而不是PK-> PK

Person 
    PersonID (PK) 
    Name 

Employee 
    EmployeeID (PK) 
    PersonID (FK) 
    DateStarted 

HourlyEmployee 
    HourlyEmployeeID (PK) 
    EmployeeID (FK) 
    HourlyRate 

顯然這是設計不好,但我不能改變它。實體框架中的每種類型繼承的表本質上都希望EmployeeID不存在,Employee的PK就是PersonID。是否可以爲這個數據庫創建一個模型,或者我可以選擇另一個工具?任何建議?

+1

這些FKs是否由獨特的約束條件創建? – 2012-07-17 17:57:29

+0

是的,這些FK保證是唯一的 – user1532573 2012-07-17 18:06:59

回答

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列在所有表中必須具有相同的名稱。

0

如果數據庫存在,您可以從數據庫創建模型,但可能不是您所期望的。 EF有時候在奇怪的數據庫結構中不能很好地工作。