EF Code First - 将子表中的两个外键列映射到同一主键

时间:2016-07-24 21:53:06

标签: c# entity-framework

假设您有一张道路英里标记点表(英里标记是美国高速公路每英里的标记)。然后,您在这些英里标记之间有第二个跨度表。 Span表有两个 int StartMileMarkerIdEndMileMarkerId,它们是引用MileMarker Id列的外键;这些是表格;

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),我可以使用Fluent Api配置DbContext中的一对多关系,如下所示

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

如何将这两列(StartMileMarkerIdEndMileMarkerId)映射到同一主键?

1 个答案:

答案 0 :(得分:1)

由于您有2个外键,因此MileMarker中需要2个集合导航属性,Span中需要2个参考导航属性。像这样:

MileMarker类:​​

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

Span class:

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集合映射到带有开头或结尾标记的跨度作为此标记,那么这是不可能的。