2012-11-21 146 views
5

我有兩個表:實體框架代碼首先映射不用擔心外鍵

要求

  • ID(int)的PK
  • 客戶端ID(INT)
  • jobnumber可以(INT)

評論

  • ID(int)的PK
  • JOB_ID(INT)
  • 評論(VARCHAR)

的表沒有外鍵,有沒有增加任何的可能性。我試圖在EF中映射它們。我有每個類,我試圖定義流利的代碼中的關係將Comment.Job_ID映射到Requirement.JobNumber。需求可以有很多評論。要求具有評論和評論列表,具有要求屬性。

我有這樣的映射設置:

modelBuilder.Entity<Comment>().HasRequired(c => c.Requirement) 
        .WithMany(s => s.Comments) 
        .HasForeignKey(f => f.Job_ID); 

我堅持試圖讓Comment.Job_ID映射到Requirement.JobNumber。

任何幫助表示讚賞。

回答

7

這是不可能的。使用實體框架,Comment.Requirement導航屬性所指的實體通常由Requirement中的(主)鍵屬性標識,即由ID標識。沒有映射選項來定義目標屬性不是關鍵屬性以外的任何內容 - 如JobNumber或另一個非關鍵屬性。

我只能想象,你可以在模型中「假」的主鍵屬性爲JobNumber而不是ID(因爲JobNumberRequirement表中是唯一):

modelBuilder.Entity<Requirement>().HasKey(r => r.JobNumber); 

我不知道如果可能有其他不希望的副作用。 (當然,如果JobNumber而不是是唯一的,因爲EF不允許有多個具有相同鍵的實體附加到上下文,並且更新/刪除等將不會找到正確的記錄數據庫)。對我來說,這感覺是錯誤的和黑客。我真的不會嘗試這樣做,因爲你沒有真正的數據庫外鍵關係,在LINQ中忘記導航屬性Requirement.CommentsComment.Requirement並使用手冊join將表數據/實體關聯爲我在特定情況下需要他們。

+0

謝謝。這非常有幫助。開始覺得我有點太過於規則了。不良的代碼氣味:-) – Matt