实体框架5多对多

时间:2012-10-01 19:31:12

标签: c# asp.net-mvc database entity-framework orm

我有问题,因为当我将以下内容添加到课程Course时,我只有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;
    }
}

请帮帮我

1 个答案:

答案 0 :(得分:5)

EF无法决定Course.StudentCourse.Students是否引用Person.CoursesAttending。您必须为EF提供一个提示,例如使用[InverseProperty]上的Course.Students属性:

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

修改

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

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);
    }
}