MVC实现多对多关系

时间:2018-06-20 12:57:36

标签: asp.net-mvc entity-framework many-to-many master-detail

这是使用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; }

实现这种情况的最简单方法是什么? 谢谢!

1 个答案:

答案 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; }
}