Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 我对在代码优先迁移中创建一对多关系的两种方法感到困惑。选择哪一个?_Sql Server_Asp.net Mvc_Entity Framework_Foreign Keys_Entity Framework Migrations - Fatal编程技术网

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

Sql server 我对在代码优先迁移中创建一对多关系的两种方法感到困惑。选择哪一个?,sql-server,asp.net-mvc,entity-framework,foreign-keys,entity-framework-migrations,Sql Server,Asp.net Mvc,Entity Framework,Foreign Keys,Entity Framework Migrations,在代码优先迁移中,我使用了两种方法来创建一对多关系,但我不知道它们之间的区别 第一种方法: 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

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

第一种方法:

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; }
}
第二种方法:

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; }
}
公共班级学生
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ICollection课程{get;set;}
}
公共课
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公立学生学生{get;set;}
}
它们都有相同的结果。请参见关系:


那么,如果我们得到相同的关系,为什么要在student表中使用
ICollection

实体框架中的关系总是有两个端点,每边都有一个导航属性和一个实体框架,该实体框架根据约定自动将它们映射到一起

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

例如:

通过使用student able(课程)的否定属性,可以简单地获取学生的所有
课程名称
,如:


您可以获取有关此链接的更多信息。

实体框架中的关系始终有两个端点,每边都有一个导航属性,实体框架根据约定自动将它们映射到一起

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

例如:

通过使用student able(课程)的否定属性,可以简单地获取学生的所有
课程名称
,如:


您可以获取有关此链接的更多信息。

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

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

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; }
}
公共班级学生
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共IList课程{get;set;}
}
公共课
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}

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

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

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; }
}
公共班级学生
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共IList课程{get;set;}
}
公共课
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}

非常感谢您。所以这意味着数据库将保持不变。我是否将Ilist包括在学生中。如果我添加此属性,那么我将能够访问一个学生的所有课程。我说得对吗?非常感谢。所以这意味着数据库将保持不变。我是否将Ilist包括在学生中。如果我添加此属性,那么我将能够访问一个学生的所有课程。我说得对吗?好吧,这对我帮助很大。您能告诉我如何使用ICollection从数据库中获取数据吗?例如var student=_context.Students.ToList();获取所有学生数据。现在我如何使用ICollection加载数据?@AlamzaibFarooq我更新了我的答案并添加了一个示例。好的,这对我帮助很大。您能告诉我如何使用ICollection从数据库中获取数据吗?例如var student=_context.Students.ToList();获取所有学生数据。现在我如何使用ICollection加载数据?@AlamzaibFarooq我更新我的答案并添加一个示例。