2013-07-18 65 views
1

我有兩個實體。每一個都有一個導航到另一個,所以EF自動創建一個m2m映射表。我的課程是Activity和Trip,所以EF創建ActivityTrip來映射關係。這是美好的 - 但:EF 5.0代碼第一 - 許多關係 - 流利的API - 覆蓋我自己生成的mm表

我需要在這些關係記錄中有額外的數據,所以想提供我自己的m2m表並使用流利的api將關係映射到此表而不是自動生成的表。

這裏是我的課:

public class Activity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Trip> Trips { get; set; } 
} 

public class Trip 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Activity> Activities { get; set; } 
} 

public class ActivityTrip //Want to use my own manytomany join table with extra fields 
{ 
    public int ActivityId { get; set; } 
    public int TripId { get; set; } 
    //Extra data 
    public string ActivityTripType { get; set; } 
} 

這裏是我的配置:

public class ActivityConfiguration : EntityTypeConfiguration<Activity> 
{ 
    public ActivityConfiguration() 
    { 
     HasKey(p => p.Id); 
     HasMany(t => t.Trips) 
     .WithMany(a => a.Activities) 
     .Map(m => 
     { 
      m.ToTable("ActivityTrip"); 
      m.MapLeftKey("ActivityId"); 
      m.MapRightKey("TripId"); 
     }); 
    } 
} 

public class TripConfiguration : EntityTypeConfiguration<Trip> 
{ 
    public TripConfiguration() 
    { 
     HasKey(p => p.Id); 
    } 
} 

public class ActivityTripConfiguration : EntityTypeConfiguration<ActivityTrip> 
{ 
    public ActivityTripConfiguration() 
    { 
     HasKey(p => new { p.ActivityId, p.TripId }); 
    } 
} 

EF仍然產生它與FKS爲M2M關係自己ActivityTrip表。 EF然後用我的兩個主鍵和額外的字段爲我編碼的第一個ActivityTrip實體生成另一個ActivityTrip1表。

看不到我想要控制m2m表的生成。並將外鍵映射到我的表。我顯然這樣做不對 - 請大家指教...

感謝, 格里

回答

-1

在接線表中的其他數據不被EF的支持,所以你需要將數據視爲另一個實體。

換言之,兩個一對多的關係與一個表示聯結表中記錄的附加實體。

您有其他實體類型 - ActivityTrip - 但您需要爲兩個一對多關係建模。

+0

感謝您的快速回復。我會這樣做,看看它是如何工作的。但是 - 問題 - 我瞭解自動生成的聯結表中的其他數據不受支持。但是我不能指定和映射我想要用於關係的我自己的表 - 只要我正確配置它?我認爲這就是配置和映射關係時流暢的API的全部內容?這不是您在映射到現有數據庫時遇到的情況嗎? – Gerry

+0

您可以使用自己的聯結表,但對於EF而言,它不是使用Map fluent API方法作爲多對多建模的,但正如使用HasRequired/Optional和HasMany fluent API的兩個一對多關係一樣方法。這在對象模型中也是有意義的,否則這些附加數據將被存儲在哪裏? – devdigital