[英]How to create the foreign key in the parent table and assign it to the child table using entity framework in asp.net mvc
[英]How to insert a record into a table with a foreign key using Entity Framework in ASP.NET MVC
我是Entity Framework代碼優先的新手。 這是我在ASP.NET MVC中的學習,使用代碼優先創建數據庫。
我有兩節課:
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; }
}
我正在嘗試將Student
記錄插入Student
表中,該表具有引用Subject
表的外鍵SubjectId
。
我正在嘗試兩種可能的方式:
第一種方法
using(var cxt = new SchoolContext())
{
Subject sub = new Subject() { SubjectId = 202, SubjectName ="Geology" };
Student stu = new Student() { Name = "Riya", SubjectId = 202 };
cxt.Subjects.Add(sub);
cxt.Students.Add(stu);
cxt.SaveChanges();
}
在這里,我創建了一個新的Subject
實例,其SubjectId=202
。 現在,當我創建Student
對象並將值202分配給SubjectId
,存在Insert
語句沖突。 雖然Subject
為SubjectId = 202
,但為什么會出現插入沖突? 當我調試時,我看到導航屬性Subjects
在這里為null。 我不明白這一點。
第二種方法:
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();
}
但我得到一個空引用異常
對象引用未設置為Object的實例
為什么這里的stu.Subjects
null?
所以我的問題是:
Student
Class中的SubjectId
是什么意思? 即它的價值與什么有關? 我們可以明確設置它,如果是,它會引用Subject
表的主鍵嗎? 如果不是,是否僅為EF代碼約定指定了它?
同樣:導航屬性的作用是什么? 為什么它為null並且何時不為null?
我對導航屬性的基本理解是它用於使EF確定兩個實體之間的關系。
任何人都可以用一些例子來澄清一下,我們將不勝感激。
你基本上都是在你的方法中創建一個新的 Student
和一個新的Subject
。 但根據我的理解,你真正要做的是創建一個新的Student
,並為其分配一個現有的 Subject
( SubjectId = 202
) - 對嗎?
您的Student
班級中的SubjectId
在此設置中完全沒有意義 - 因為您在Student
和Subject
之間有1:n的關系。 您需要使用該ICollection<Subject>
來處理此學生注冊的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關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.