我有这个场景:
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; }
}
如何将列Table1Code
和Table2Code
的外键添加到表Table1_Table2
?
我不需要将外键添加到Table1
和Table2
,而是添加到表Table1_Table2
。
答案 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关系的实体的表的外键。
因此,通过您在类Table1
和Table2
中所做的事情,EF本身将创建第三个映射表。因此,没有特别需要创建第三个表Table3
但是,如果出于域名原因,您想要创建映射Table2
和Table1
的第三个映射实体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; }
}