【问题标题】:EF Code First - mapping two foreign key columns in child table to the same primary keyEF Code First - 将子表中的两个外键列映射到同一个主键
【发布时间】:2016-07-24 21:53:06
【问题描述】:

假设您有一张道路英里标记点表(英里标记是美国高速公路上每英里放置的标志)。然后,您在这些英里标记之间有第二个跨度表。 Span 表有两个intStartMileMarkerIdEndMileMarkerId,它们是引用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),我可以在 DbContext 中使用 Fluent Api 配置一对多关系,如下所示

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

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案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);
    

    附:如果您的想法是将ModelMarker.Spans 集合映射到跨度,其中开始或结束标记是此标记,这是不可能的。

    【讨论】:

    • 太棒了!这正是我一直在寻找的。谢谢
    • f9r或startspan和endspan是否可以只有一个外键列?
    • @mko 这是一个链接表,所以不,它们必须是两个。
    • 如果你使用一个抽象类并且有两个独立的数据表怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多