C# 实体框架5多对多

C# 实体框架5多对多,c#,asp.net-mvc,database,entity-framework,orm,C#,Asp.net Mvc,Database,Entity Framework,Orm,我有这个问题,因为当我将以下内容添加到课程中时,我只有2个表,而不是3个 public int PersonId { get; set; } [ForeignKey("PersonId")] public virtual Person Student { get; set; } 这三行不是都很好,但我需要在课堂上增加一个字段 public class Person { public int PersonId { get; set; } public string FirstNa

我有这个问题,因为当我将以下内容添加到课程中时,我只有2个表,而不是3个

public int PersonId { get; set; }
[ForeignKey("PersonId")]
public virtual Person Student { get; set; }
这三行不是都很好,但我需要在课堂上增加一个字段

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Course> CoursesAttending { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public string Title { get; set; }
    public int PersonId { get; set; }

        [ForeignKey("PersonId")]
    public virtual Person Student { get; set; }

    public virtual ICollection<Person> Students { get; set; }
}

public class SchoolContext : DbContext
{
    public DbSet<Course> Courses { get; set; }
    public DbSet<Person> People { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Database.SetInitializer<SchoolContext>(
                new DropCreateDatabaseAlways<SchoolContext>());

        SchoolContext db = new SchoolContext();
        var cos = from d in db.Courses
                  select d;
    }
}
公共类人物
{
公共int PersonId{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共虚拟ICollection课程尝试{get;set;}
}
公共课
{
public int CourseId{get;set;}
公共字符串标题{get;set;}
公共int PersonId{get;set;}
[外键(“人名”)]
公共虚拟人学生{get;set;}
公共虚拟ICollection学生{get;set;}
}
公共课堂背景:DbContext
{
公共数据库集课程{get;set;}
公共数据库集人物{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
Database.SetInitializer(
新建DropCreateDatabaseAlways());
SchoolContext db=新的SchoolContext();
var cos=以分贝计算的d
选择d;
}
}

请帮助我

EF无法决定是
课程。学生
还是
课程。学生
指的是
个人。课程参加
。您必须给EF一个提示,例如使用
课程上的
[InverseProperty]
属性。学生

[InverseProperty("CoursesAttending")]
public virtual ICollection<Person> Students { get; set; }

您只定义了两个表(
课程
人员
)。我不确定第三个表来自何处。@48klocs:第三个表是多对多关系的联接表,如果
课程。学生
不在模型中,EF将根据约定自动检测该联接表。使用该属性,EF不再检测多对多关系,第三个表消失,可以这么说……当我添加此代码时,我出现了错误:附加信息:在表“CoursePersons”上引入外键约束“FK_dbo.CoursePersons_dbo.People_PersonId”可能导致循环或多个级联路径。指定“不删除任何操作”或“不更新任何操作”,或修改其他外键约束。@user1644160:请参见“我的编辑”。希望这能修复错误。你能解释一下你为什么喜欢。WillCascadeOnDelete(false)?@Nikos:我的答案的编辑部分解释了这一点。SQL Server不允许在同一个表上有两个级联删除路径,因此必须至少禁用一个级联删除,这是
WillCascadeOnDelete(false)
所做的。
public class MyContext : DbContext
{
    //...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Course>()
            .HasRequired(c => c.Student)
            .WithMany()
            .HasForeignKey(c => c.PersonId)
            .WillCascadeOnDelete(false);
    }
}