我是新的實體框架代碼優先。這是我在ASP.NET MVC中的學習,使用代碼優先進行數據庫創建。如何使用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
表,其中有一個外鍵SubjectId
引用Subject
表。
我想它有兩種可能的方式:
第一種方法
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
在這裏爲空。我不明白這一點。
第二種方法:
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();
}
,但我得到了一個空引用異常
對象引用未設置到對象
的情況下爲什麼空嗎?
所以在這裏我的問題是:
是什麼在
Student
類SubjectId
是什麼意思?即它的價值是什麼?我們可以明確地設置它,如果是的話,它會引用Subject
表的主鍵嗎?如果不是,是否僅爲EF代碼慣例指定?同樣:導航屬性的作用是什麼?爲什麼它是空的,什麼時候它不會爲空?
我的導航屬性的基本理解是,它是用來做EF確定這兩個實體之間的關係。
任何人都可以請澄清一些例子,將不勝感激。
學生課中不應該有SubjectId。您可能正在尋找[多對多]:一個學生可以擁有一個或多個教師很多科目,一個科目可以有很多學生。 –
在'Student'中,請務必將您的'Subjects'集合標記爲虛擬。 – Tipx
@Tipx - 虛擬僅在需要[延遲加載](https://stackoverflow.com/questions/15247614/understanding-code-first-virtual-properties)時才需要。這不是問題。 –