2

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

请帮我

4

1 回答 1

5

EF 无法决定是否Course.StudentCourse.Students引用Person.CoursesAttending. 您必须给 EF 一个提示,例如通过使用[InverseProperty]on 属性Course.Students

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

编辑

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

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);
    }
}
于 2012-10-01T19:47:39.687 回答