C# 如何在ASP.NET MVC中使用实体框架将记录插入带有外键的表中
我对实体框架代码还不熟悉。这是我在ASP.NETMVC中学习的,首先使用代码创建数据库 我有两门课: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
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();
}