实体框架代码首先通过关系表导航属性

本文关键字:关系 导航 属性 框架 代码 实体 | 更新日期: 2023-09-27 18:13:42

我试图设置一些导航属性与一些实体框架代码第一模型。我希望它们看起来像这个例子:

public class Course
{
    [Key]
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}
public class Student
{
    [Key]
    public int StudentId { get; set; }
    public string StudentName { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}
public class StudentCourses
{
    [Key, Column(Order = 0)]
    public int StudentId { get; set; }
    public virtual Student Student { get; set; }
    [Key, Column(Order = 1)]
    public int CourseId { get; set; }
    public virtual Course Course { get; set; }
}

因此,学生和课程关系将在StudentCourses表中建立。student类的实例将自动引用所有学生的课程,反之亦然,Course类的实例将自动引用其所有学生。StudentCourses类的实例将自动引用它的Student和Course。但是当我尝试更新数据库时,关系似乎没有得到正确的解释。我还遗漏了什么吗?也许需要在上下文类中进行一些配置?大多数导航属性的示例只显示一对多关系导航属性。

实体框架代码首先通过关系表导航属性

当您有一个M : M关系时,您需要像下面所示的那样构建您的模型。不需要构造连接表。当您进行数据迁移时,EF将为您创建一个。

使用约定模型配置

public class Student
{
    public Student() 
    {
        this.Courses = new HashSet<Course>();
    }
    public int StudentId { get; set; }
    public string StudentName { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
    public Course()
    {
        this.Students = new HashSet<Student>();
    }
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}

你的上下文类应该是这样的。

public class YourDBContext : DBContext
{
    public YourDBContext () : base("Default")
    {
    }
    public DbSet<Student> Students { get; set; }
    public DbSet<Course> Courses { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }
}

在遵循Sampath的建议后,我实际上决定要将一些其他属性附加到关系中。所以我最后定义了StudentCourses类,像这样:

public class StudentCourses
{
    [Key, Column(Order = 0)]
    public int StudentId { get; set; }
    public virtual Student Student { get; set; }
    [Key, Column(Order = 1)]
    public int CourseId { get; set; }
    public virtual Course Course { get; set; }
    public int Grade { get; set; }
}

所以我更改了Student和Course:

public class Course
{
    [Key]
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public virtual ICollection<StudentCourses> Students { get; set; }
}
public class Student
{
    [Key]
    public int StudentId { get; set; }
    public string StudentName { get; set; }
    public virtual ICollection<StudentCourses> Courses { get; set; }
}

最重要的是,我没有将StudentCourses添加到DbContext。因此,在执行Update-Database之后,EF自动为StudentCourses创建了表,并且导航属性都工作了。