2016-07-24 43 views
1

假設您有一張道路里程標記點表(里程標記是美國高速公路上每英里放置的標誌)。然後你在這些英里標記之間有第二張跨度表。 Span表有兩個intStartMileMarkerIdEndMileMarkerId它們是引用MileMarker Id列的外鍵;這些是表格;EF代碼優先 - 將子表中的兩個外鍵列映射到相同的主鍵

tblMileMarkers

[Table("tblMileMarkers")] 
    public class MileMarker 
    { 
     public MileMarker() 
     { 
      Spans = new HashSet<Span>(); 
     } 

     [Key] 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public DbGeography Location { get; set; } 

     public virtual ICollection<Span> Spans { get; set; } 
    } 

tblSpans

[Table("tblSpans")] 
    public class Span 
    { 
     [Key] 
     public int Id { get; set; } 
     [Required, StringLength(100)] 
     public string Name { get; set; } 
     public int StartMileMarkerId { get; set; } 
     public int EndMileMarkerId { get; set; } 

     public virtual MileMarker MileMarker { get; set; } 
    } 

如果只有一個外鍵(StartMileMarkerId),我可以配置在的DbContext用流利的API一對多關係如下

modelBuilder.Entity<Span>().HasRequired(s => s.MileMarker) 
       .WithMany(m => m.Spans) 
       .HasForeignKey(s => s.StartMileMarkerId); 

如何映射這2列(StartMileMarkerIdEndMileMarkerId)到相同的主鍵?

回答

1

由於您有2個外鍵,因此您需要MileMarker中的2個集合導航屬性和Span中的2個參考導航屬性。事情是這樣的:

MileMarker類:​​

public virtual ICollection<Span> StartSpans { get; set; } 
public virtual ICollection<Span> EndSpans { get; set; } 

跨度類:

public virtual MileMarker StartMileMarker { get; set; } 
public virtual MileMarker EndMileMarker { get; set; } 

配置:

modelBuilder.Entity<Span>() 
    .HasRequired(s => s.StartMileMarker) 
    .WithMany(m => m.StartSpans) 
    .HasForeignKey(s => s.StartMileMarkerId); 

modelBuilder.Entity<Span>() 
    .HasRequired(s => s.EndMileMarker) 
    .WithMany(m => m.EndSpans) 
    .HasForeignKey(s => s.EndMileMarkerId); 

P.S.如果您的想法是將ModelMarker.Spans集合映射爲跨度,並且開始標記或結束標記都是該標記,則這是不可能的。

+0

太棒了!這正是我所期待的。謝謝 –

相關問題