实体框架代码首先是多对多的

时间:2011-04-05 10:24:41

标签: entity-framework many-to-many code-first ef-code-first

我搜索过每一个但却找不到答案......

首先,我首先使用代码创建了多对多关系,但效果很好。每个人可以在多个俱乐部,每个俱乐部可以有多个成员。已在DB中创建ClubPersons表。

public class Person
{
    public int PersonId { get; set; }
    public virtual ICollection<Club> Clubs { get; set; }
}

public class Club
{
    public int ClubId { get; set; }
    public virtual ICollection<Person> Members { get; set; }
}

然后我需要添加俱乐部的创建者,这也是一个人(一对多):

public class Club
{
    public int ClubId { get; set; }
    public virtual ICollection<Person> Members { get; set; }
    public virtual Person Creator { get; set; }
}

执行此操作后,数据库中的ClubPersons表已经消失,取而代之的是Club_Id表格中的People以及Person_IdCreator_Id Clubs表。

正如您所看到的,这不起作用,当我尝试添加人/俱乐部时,它会给我以下错误:

Multiplicity constraint violated. The role 'Person_Clubs_Source' of the relationship 'Test.Models.Person_Clubs' has multiplicity 1 or 0..1.

我的问题是,首先在代码中定义这种关系的正确方法是什么?多对多对一

非常感谢

1 个答案:

答案 0 :(得分:10)

将以下方法添加到您的上下文中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Club>().HasRequired(x => x.Creator) //or HasOptional
                               .WithMany() //Unidirectional
                               .Map(x => x.MapKey("Creator")) //FK column Name
                               .WillCascadeOnDelete(false);
}

这将使EF在Club.Creator上保持双向关系&lt; =&gt; Person.Clubs