实体框架代码 - 第一个外键到多对多表

时间:2017-09-20 10:21:37

标签: c# entity-framework foreign-keys ef-code-first-mapping

我有这个场景:

public class Table1
{
    [Key]
    public string Table1Code { get; set; }

    public virtual List<Table2> Table2 { get; set; }
}

public class Table2
{
    [Key]
    public string Table2Code { get; set; }

    public virtual List<Table1> Table1 { get; set; }    
}

然后我创建了一个用于指定多对多表的配置类:

public class Table1Configuration : EntityTypeConfiguration<Table1>
{
    public Table1Configuration()
    {
        HasMany(g => g.Table2)
            .WithMany(r => r.Table1)
            .Map(c =>
            {
                c.ToTable("Table1_Table2");
                c.MapLeftKey("Table1Code");
                c.MapRightKey("Table2Code");
            });
    }
}

现在我必须像这样创建一个Table3

public class Table3
{
    [Key]
    public string Table3Code { get; set; }

    public string Table1Code { get; set; }
    public string Table2Code { get; set; }
}

如何将列Table1CodeTable2Code的外键添加到表Table1_Table2

我不需要将外键添加到Table1Table2,而是添加到表Table1_Table2

2 个答案:

答案 0 :(得分:1)

如果没有明确的Table1_Table2类,不确定是否可以这样做:

public class Table1_Table2
{
    public string Table1Code { get; set; }  // PK 1
    public string Table2Code { get; set; }  // PK 2
    public virtual Table3 Table3 { get; set; }    
}

然后:

public class Table3
{
    // Not needed in 1:1
    // [Key]
    // public string Table3Code { get; set; }
    public string Table1Code { get; set; }
    public string Table2Code { get; set; }
    // Make this a collection for 1:M
    public virtual Table1_Table2 Table1_Table2 { get; set; }    
}

流利代码:

modelBuilder.Entity<Table3>()
    .HasKey(t3 => new { t3.Table1Code, t3.Table2Code });

modelBuilder.Entity<Table1_Table2>()
    .HasOptional(t => t.Table3)
    .WithRequired(t3 => t3.Table1_Table2);

答案 1 :(得分:0)

像你已经使用EF那样的Many2Many(M2M)关系会创建一个表,该表具有与具有M2M关系的实体的表的外键。

因此,通过您在类Table1Table2中所做的事情,EF本身将创建第三个映射表。因此,没有特别需要创建第三个表Table3

但是,如果出于域名原因,您想要创建映射Table2Table1的第三个映射实体Table2,则必须按以下方式修改类。

public class Table1
{
    [Key]
    public string Table1Code { get; set; }

    public virtual List<Table3> Table3 { get; set; }
}

public class Table2
{
    [Key]
    public string Table2Code { get; set; }

    public virtual List<Table3> Table3 { get; set; }    
}

 public class Table3
{
    [Key]
    public string Table3Code { get; set; }

    public Table1 Table1 { get; set; }
    public string Table1Code { get; set; }

    public Table2 Table2 { get; set; }
    public string Table2Code { get; set; }
}