与EF 6 Code中的额外列有多对多关系?

时间:2017-07-06 23:29:56

标签: c# entity-framework

说我是否有学生和课程的经典例子。学生可以有很多课程,课程可以有很多学生。

如果我想在多个表格部分添加额外字段,如何在EF 6代码中创建中间表?

我是否只是在代码中创建另一个类,然后以某种方式将其挂起?

数据库上下文

public class MyContext : DbContext
{
    public MyContext (string nameOrConnectionString) : base(nameOrConnectionString)
    {
        // this.Configuration.ProxyCreationEnabled = false;
        Database.SetInitializer(new CreateDatabaseIfNotExists<OSPContext>());
    }

    public DbSet<Student> Students { get; set; }
    public DbSet<Course> Courses { get; set; }

    public DbSet<StudentCourse> StudentCourses { get; set; }

}


public class StudentCourse
{
    [Key]
    public Guid StudentCourseId { get; set; }

    public Guid StudentId { get; set; }

    [ForeignKey("StudentId")]
    public virtual Student Student { get; set; } // Include this so you can access it later

    public Guid CourseId { get; set; }

    [ForeignKey("CourseId")]
    public virtual Course Course { get; set; }

    public int Permissions { get; set; }
}

public class Course
{
    [Key]
    public  Guid Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Student> Students { get; set; } = new >();
}

public class Student
{
    [Key]
    public  Guid Id { get; set; }
    public  string Email { get; set; }
    public virtual ICollection<Course> Courses { get; set; } = new List<Course>();

}

2 个答案:

答案 0 :(得分:5)

鉴于你是代码,我会做类似以下的事情。

public class Student
{
    [Key]
    public int StudentId { get; set; }
    public string Name { get; set; }

    public List<StudentCourse> Courses { get; set; } // So you can access Courses for a student
}

public class Course
{
    [Key]
    public int CourseId { get; set; }
    public string Name { get; set; }

    public List<StudentCourse> Students { get; set; }
}

public class StudentCourse
{
    [Key]
    public int StudentCourseId { get; set; }

    public int StudentId { get; set; }
    [ForeignKey("StudentId")]
    public Student Student { get; set; } // Include this so you can access it later

    public int CourseId { get; set; }        
    [ForeignKey("CourseId")]
    public Course Course { get; set; } 
}

编辑:想要注意与数据属性建立关系,您也可以使用EF Fluent API建立您的关系。属性看起来相同,但没有[ForeignKey("")]

答案 1 :(得分:0)

如果至少使用Code-First:

当您创建两个星形关系上具有星形的模型时(例如使用您正在执行的列表),Code First将在您添加迁移时为您创建关联表。