Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
C# 如何在ASP.NET MVC中使用实体框架将记录插入带有外键的表中_C#_Entity Framework_Ef Code First Mapping - Fatal编程技术网

C# 如何在ASP.NET MVC中使用实体框架将记录插入带有外键的表中

C# 如何在ASP.NET MVC中使用实体框架将记录插入带有外键的表中,c#,entity-framework,ef-code-first-mapping,C#,Entity Framework,Ef Code First Mapping,我对实体框架代码还不熟悉。这是我在ASP.NETMVC中学习的,首先使用代码创建数据库 我有两门课: public class Student { public int StudentId { get; set; } public string Name { get; set; } public int Standard { get; set; } public int SubjectId { get; set; } [F

我对实体框架代码还不熟悉。这是我在ASP.NETMVC中学习的,首先使用代码创建数据库

我有两门课:

public class Student
{
    public int StudentId { get; set; }
    public string Name { get; set; }
    public int Standard { get; set; }            
    public int SubjectId { get; set; }    

    [ForeignKey("SubjectId")]
    public ICollection<Subject> Subjects { get; set; }
}

public class Subject
{
    [Key]
    public int SubjectId{ get; set; }
    public string SubjectName { get; set; }
}
在这里,我创建了一个新的
Subject
实例,它的
SubjectId=202
。现在,当我创建
Student
对象并将值202赋给
SubjectId
时,有一个
Insert
语句冲突。虽然存在
主题
主题ID=202
,但为什么会存在插入冲突?当我调试时,我看到导航属性
Subjects
在这里为空。我不明白这里的意思

第二种方法:

using( var cxt=new SchoolContext())
{
    Student stu = new Student() { Name = "Riya" };
    Subject sub = new Subject() { SubjectId = 202, SubjectName = "Geology" };
    stu.Subjects.Add(sub);
    cxt.Students.Add(stu);               

    cxt.SaveChanges();
}
但我得到一个空引用异常

对象引用未设置为对象的实例

为什么
stu.Subjects
在这里为空

所以我的问题是:

  • Student
    课程中的
    subject
    是什么意思?即,其价值与什么有关?我们是否可以显式设置它,如果是,它是否会引用
    Subject
    表的主键?如果否,是否仅指定用于EF代码约定

  • 类似地:导航属性的角色是什么?为什么为空,何时不为空

  • 我对导航属性的基本理解是,它用于使EF确定两个实体之间的关系


    任何人都可以举例说明一下,这将非常感谢。

    在这两种方法中,你基本上是在创建一个新的学生和一个新的主题。但据我所知,你真正想做的是创建一个新的
    学生
    ,并为其分配一个现有的
    主题
    (带有
    SubjectId=202
    ),对吗

    在这种设置中,
    Student
    类中的
    Subject
    毫无意义,因为
    Student
    Subject
    之间有1:n的关系。您需要使用该
    i集合
    来处理该学生注册的0:n科目

    为此,请使用以下代码:

    using(var ctx = new SchoolContext())
    {
        // create the *NEW* Student
        Student stu = new Student() { Name = "Riya" };
    
        // get existing subject with Id=202
        Subject sub = ctx.Subjects.FirstOrDefault(s => s.SubjectId == 202);
    
        // Add this existing subject to the new student's "Subjects" collection
        stu.Subjects.Add(sub);
    
        // Add the new student to the context, and save it all.
        ctx.Students.Add(stu);           
    
        ctx.SaveChanges();
    }
    

    这样就可以了-一个新的学生将被插入到您的数据库表中,学生和他的科目之间的1:n关系将被建立。

    您的学生课堂上不应该有任何科目。您可能正在寻找:一个学生可以有许多科目,一个科目可以有许多学生。在
    student
    中,确保将您的
    subjects
    集合标记为虚拟。@Tipx-virtual仅在需要时才需要。这不是问题。首先你需要决定你需要什么样的关系,其次你需要初始化外键对象以便能够通过外键插入。学生/课程示例我不能这样做,创建一个新的
    主题
    ,调用
    保存更改
    ,接下来创建
    Student
    retrieve Subject并将此
    Subject
    添加到新的
    Student
    using(var ctx = new SchoolContext())
    {
        // create the *NEW* Student
        Student stu = new Student() { Name = "Riya" };
    
        // get existing subject with Id=202
        Subject sub = ctx.Subjects.FirstOrDefault(s => s.SubjectId == 202);
    
        // Add this existing subject to the new student's "Subjects" collection
        stu.Subjects.Add(sub);
    
        // Add the new student to the context, and save it all.
        ctx.Students.Add(stu);           
    
        ctx.SaveChanges();
    }