实体框架6 2 *多对多自我

时间:2018-12-06 12:42:59

标签: entity-framework entity-framework-6 ef-code-first

在Entity Framework 6中使用代码优先。

我有这个实体:

public class LineSection
{
    public int Id { get; set; }
    public List<LineSection> Next { get; set; }
    public List<LineSection> Previous { get; set; }
}

我添加一个迁移,只是为了查看数据库的状态:

        CreateTable(
            "dbo.LineSectionLineSections",
            c => new
                {
                    LineSection_Id = c.Int(nullable: false),
                    LineSection_Id1 = c.Int(nullable: false),
                })
            .PrimaryKey(t => new { t.LineSection_Id, t.LineSection_Id1 })
            .ForeignKey("dbo.LineSections", t => t.LineSection_Id)
            .ForeignKey("dbo.LineSections", t => t.LineSection_Id1)
            .Index(t => t.LineSection_Id)
            .Index(t => t.LineSection_Id1);

我不喜欢默认命名。我可以更改表名(LineSectionLineSections)和两个外键(LineSection_Id和LineSection_Id1)。使用modelbuilder,数据属性还是其他方式?

1 个答案:

答案 0 :(得分:2)

使用Map流利的API对具有隐式联接表的多对多关系进行配置(无论t是否是自身)。您可以使用ToTable指定表名,并使用MapLeftKey / MapRightKey指定对应的列名(左为正在配置的实体,右为关系的另一端)。 / p>

因此,在您的情况下,将是这样的:

modelBuilder.Entity<LineSection>()
   .HasMany(e => e.Next)
   .WithMany(e => e.Previous)
   .Map(m => m.MapLeftKey("PrevId")
          .MapRightKey("NextId")
          .ToTable("LineSectionLinks")
   );