假设您有一张道路英里标记点表(英里标记是美国高速公路每英里的标记)。然后,您在这些英里标记之间有第二个跨度表。 Span表有两个 int 列StartMileMarkerId
和EndMileMarkerId
,它们是引用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);
如何将这两列(StartMileMarkerId
和EndMileMarkerId
)映射到同一主键?
答案 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
集合映射到带有开头或结尾标记的跨度作为此标记,那么这是不可能的。