实体框架5多对多

use*_*160 2 c# database asp.net-mvc orm entity-framework

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

public int PersonId { get; set; }
[ForeignKey("PersonId")]
public virtual Person Student { get; set; }
Run Code Online (Sandbox Code Playgroud)

你没有这三条线路都很好,但我需要在课程课程中增加一个字段

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请帮我

Sla*_*uma 5

EF不能决定是否Course.StudentCourse.StudentsPerson.CoursesAttending.您必须给EF一个提示,例如使用以下[InverseProperty]属性Course.Students:

[InverseProperty("CoursesAttending")]
public virtual ICollection<Person> Students { get; set; }
Run Code Online (Sandbox Code Playgroud)

编辑

该模型将导致多个级联删除路径,即:当您删除Person连接表中的记录时也将被删除,但它也将删除Course该人通过该Course.Person属性分配的所有内容.删除的Courses将再次删除连接表中的记录,这是同一个表上的第二个删除路径.

SQL Server不允许多个级联删除路径,因此必须使用Fluent API禁用它:

public class MyContext : DbContext
{
    //...

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