我对在代码优先迁移中创建一对多关系的两种方式感到困惑。选择哪一个?

I am confused in two ways to create one to many relationship in code first migration . Which one to choose?

我在代码优先迁移中使用了两种方法来创建一对多关系,我不知道它们之间有什么区别。

第一种方法:

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Student Student { get; set; }
}

第二种方法:

 public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Course> Courses { get; set; }
}

public class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Student Student { get; set; }
}

它们的结果相同。查看关系:Relationship Diagram

那么,如果我们得到相同的关系,为什么我们在学生 table 中使用 ICollection

entity framework 中的关系总是有两端,每一端都有一个导航 属性 和一个 Entity Framework 按照约定自动将它们映射在一起。

在您的示例中,学生和课程 class 具有一对多关系。这里,Id(Studenttable)将成为Studenttable的主键和Courseclass中Student_Id属性的ForeignKey属性,以便外键key.You 必须在课程 class 的 ForeignKey 属性中传递学生实体。因此,代码首先使用 DataAnnotations 属性在学生和课程 class 之间创建一对多关系。

例如:

您可以通过使用学生能力(课程)的否定 属性 来简单地获取学生的所有 course Name,例如:

_context.Students
       .Include(s => s.Courses)     
       .Courses.Select(c=>c.Name).ToList();

您可以找到有关 One-to-Many 这个 link 的更多信息。

在第一种方法中,您将一名学生分配给课程实体,这意味着只有一名学生将被分配到一门课程中,我认为这是错误的,因为会有很多学生在学习同一门课程。

理想情况下,课程不应依赖于学生实体。你应该给学生分配正确的课程。如果一个学生可以选修多门课程,那么第二种方法几乎是正确的,唯一的问题是您可以从课程实体中删除学生 属性,如下所示。 但是,如果一个学生只能选修一门课程,那么您可以修改学生实体并分配一门课程而不是课程列表。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Course> Courses { get; set; }
}

public class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
}