2013-03-12 23 views
11

以下是我試圖定義外鍵關係的兩個部分表。在主表中創建與重命名字段和非主鍵的實體關係

public class Form 
{ 
    [Key, Column("FormID")] 
    public System.Guid FormGUID { get; set; } 

    [Column("PatGUID")] 
    public Nullable<System.Guid> PatientGUID { get; set; } 
} 

public class Patient 
{ 
    [Column("PatGUID")] 
    public System.Guid PatientGUID { get; set; } 

    [Key, Column("PatID")] 
    public int PatientID { get; set; } 

}

我已經消除了所有,但相關信息,字段,導航等,在這個例子中,希望不要太多。

我們有一個表格,其中FK爲PatGUID,病人列表爲PatGUID。 病人表有一個PatID int KEY字段。

我們有要求將我們的字段重命名爲我們的代碼第一個實體模型;本示例中需要更改的相關字段爲PatGUID,更改爲PatientGUID

我遇到的困難是試圖使用註釋或流利來定義這個外鍵。

所以最終的結果我需要的是:

  • 主鍵表:患者,場:PatGUID(改名PatientGUID)

  • 外鍵表:表單,字段:PatGUID (更名爲PatientGUID)

這似乎並不像它應該構成一個大問題,但Patient.PatGUID不是主鍵和PatGUID字段被重命名爲PatientGUID的組合未啓用WCF數據服務正確創建具有適當引用的引用因此正確的選擇/加入:

SELECT … FROM [dbo].[Form] AS [Extent1] 
INNER JOIN [dbo].[Patient] AS [Extent2] ON [Extent1].[PatGUID] = [Extent2].[PatGUID] 

回答

14

EF尚不支持主體的關鍵不是主鍵但是具有唯一鍵約束的其他列的關係。它是on the feature request list,但是也未在下一版本(EF 6)的路線圖上實施。如果它完全實現(可能在EF 7中),預計等待一年或更長時間,直到它準備好生產。

在您的特定型號EF完全不認識FormPatient之間的任何關係,因爲Patient.PatientID被標記爲[Key],不Patient.PatientGUID和EF把Form.PatientGUID作爲一個普通的標量屬性,而不是作爲一個FK到Patient

在理論上可以僞造Patient.PatientGUID作爲模型的[Key]屬性雖然它不是在數據庫中的主鍵,如果你不創建一個從數據庫模型或從代碼優先模型數據庫,即,如果您手動在模型和(現有)數據庫之間進行映射。但我不確定這是否會導致其他地方的微妙問題。

如果你想取Patients和相關Forms替代是寫在LINQ手冊join陳述。然後您可以使用任意屬性連接兩個實體,而不僅僅是關鍵屬性。在我看來,這是更清潔,不太「棘手」的方法。然而,缺點是你不會有PatientForm之間的導航屬性(引用或集合),並且你不能使用像加載(Include),延遲加載或舒適的「虛線路徑語法」(如Form.Patient.SomePatientProperty等) )在你的LINQ查詢中。

+3

不完全是我想聽到的,但至少有一個明確的答案,爲什麼我不能得到這個工作,並知道我需要想出替代解決方案。 – user2144404 2013-03-13 10:42:44