2016-11-04 90 views
0

我想使用代碼優先和流暢API基於3個實體創建3個表。我正在使用實體框架版本6.連接表需要一個3列主鍵和其他列。使用3列主鍵進行多對多連接表

我的問題:如何在C#Fluent API中使用代碼優先爲PatientTreatment表創建/映射3列主鍵?謝謝。

連接表的3列主鍵的詳細信息{PatentId,TreatmentId,TreatmentDate}PatentIdTreatmentId的值取自其他2個實體(表),而TreatmentDate的值是手動輸入的(例如C#代碼或T-SQL腳本,如調用getdate()函數)。在3個實體

詳情:

public class Patient { 
    public long PatentId {get; set;} // database created using Identity 
    ... 
} 

public class Treatment { 
    public long TreatmentId {get; set;} // database created using Identity 
    ... 
} 

和連接表(實體)

public class PatientTreatment 
{ 
    public long PatentId {get; set;} // part of the primary key from the Patient entity 
    public long TreatmentId {get; set;} // part of the primary key from the Treatment entity 
    public DateTime TreatmentDate {get; set;} // part of the primary key but its value is from C# code or from T-SQL script, not from other entity (table) 
    // other fields ... 
} 

回答

1

你不能這個模型的許多一對多協會其中PatientTreatment類是隱藏的,這在實體框架映射中通常被稱爲多對多。

但是您不打算這麼做,從您展示的顯式PatientTreatment類中可以明顯看出。所以這只是正確建模的問題。

OnModelCreating覆蓋您DbContext子類,設置的像這樣的映射:

protected override void OnModelCreating(DbModelBuilder mb) 
{ 
    mb.Entity<PatientTreatment>() 
     .HasKey(x => new { x.PatientId, x.TreatmentId, x.TreatmentDate }); 
    mb.Entity<Patient>().HasMany(p => p.PatientTreatments) 
     .WithRequired().HasForeignKey(x => x.PatientId); 
    mb.Entity<Treatment>().HasMany(t => t.PatientTreatments) 
     .WithRequired().HasForeignKey(x => x.TreatmentId); 

    base.OnModelCreating(mb); 
} 

我覺得這條線HasKey(x => new { x.PatientId, x.TreatmentId, x.TreatmentDate })就是你要找的人爲主。

0

我只是產品查詢它計算器

這是不可能建立一個多與 自定義連接表的一對多關係。在多對多關係中,EF在內部管理 連接表並隱藏。這是您的模型中沒有實體類 的表格。爲了與這樣的額外 性連接表工作,你將有實際創建兩個一對多 關係 檢查這個many to many with extra column