这是使用MVC .net框架和实体框架的“数据库优先”方法完成的。两个表之间存在多对多关系。它们通过第三张表连接,第三张表组合了第一张表的ID和第二张表的ID。
public class ManyToManyTable
{
[Required]
[Key, Column(Order=0)]
public int firsttableid { get; set; }
[Required]
[Key, Column(Order=1)]
public int secondtableid { get; set; }
public int something { get; set; }
[ForeignKey("firsttableid")]
public virtual FirstTable firstTable { get; set; }
[ForeignKey("secondtableid")]
public virtual SecondTable secondTable { get; set; }
}
第一张表和第二张表具有一些ID作为主键。
我想创建视图和控制器方法,以启用此ManyToManyTable的主要详细信息输入表单。它将在主菜单中包含FirstTable的详细信息,在SecondTAble中将具有FirstTable的详细信息,并在按下“保存”按钮时将其全部保存在ManyToManyTable中。
当然,第一表和第二表都具有此属性:
public virtual ICollection<ManyToManyTable> ManyToManyTables { get; set; }
实现这种情况的最简单方法是什么? 谢谢!
答案 0 :(得分:0)
EF对于多对多关系具有默认约定。无需创建特定的
映射类。您必须在“ FirstTable”和“ SecondTable”类中都包含导航属性,如下所示。
public class FirstTable
{
public FirstTable()
{
secondTableProperties = new HashSet<SecondTable>();
}
public int Id { get; set; }
public int MyProperty2 { get; set; }
public int MyProperty3 { get; set; }
public virtual ICollection<SecondTable> secondTableProperties { get; set; }
}
public class SecondTable
{
public SecondTable()
{
FirstTableProperties = new HashSet<FirstTable>();
}
public int Id { get; set; }
public int MyProperty2 { get; set; }
public int MyProperty3 { get; set; }
public virtual ICollection<FirstTable> FirstTableProperties { get; set; }
}
从DBContext中删除映射类,仅包括上述两个类。生成并运行该应用程序后,EF将在SQL Server中自动创建一个Mapping表。通常,“映射”表仅包含其他两个表的主键。
您可以使用Fluent API对创建的映射表进行一些控制
modelBuilder.Entity<FirstTable>()
.HasMany<SecondTable>(s => s.FirstTableProperties)
.WithMany(c => c.secondTableProperties)
.Map(cs =>
{
cs.MapLeftKey("FirstTableId");
cs.MapRightKey("SecondTableId");
cs.ToTable("ManyToManyTable");
});
如果要使用具有其他属性的联接表,上述多对多关系将不起作用。在这种情况下,您将必须创建两个一对多关系,如下所示。
public class FirstTable
{
public int Id { get; set; }
public int MyProperty2 { get; set; }
public virtual ICollection<ManyToManyTable> manytomany { get; set; }
}
public class SecondTable
{
public int Id { get; set; }
public int MyProperty2 { get; set; }
public virtual ICollection<ManyToManyTable> manytomany { get; set; }
}
public ManyToManyTable
{
[Required]
[Key, Column(Order=0)]
public int firsttableid { get; set; }
[Required]
[Key, Column(Order=1)]
public int secondtableid { get; set; }
public int AdditionalProperty { get; set; }
public virtual FirstTable first { get; set; }
public virtual SecondTable Second { get; set; }
}