簡體   English   中英

如何使用ASP.NET MVC中的Entity Framework將記錄插入到具有外鍵的表中

[英]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語句沖突。 雖然SubjectSubjectId = 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?

所以我的問題是:

  1. Student Class中的SubjectId是什么意思? 即它的價值與什么有關? 我們可以明確設置它,如果是,它會引用Subject表的主鍵嗎? 如果不是,是否僅為EF代碼約定指定了它?

  2. 同樣:導航屬性的作用是什么? 為什么它為null並且何時不為null?

我對導航屬性的基本理解是它用於使EF確定兩個實體之間的關系。

任何人都可以用一些例子來澄清一下,我們將不勝感激。

你基本上都是在你的方法中創建一個新的 Student和一個新的Subject 但根據我的理解,你真正要做的是創建一個新的Student ,並為其分配一個現有的 SubjectSubjectId = 202 ) - 對嗎?

您的Student班級中的SubjectId在此設置中完全沒有意義 - 因為您在StudentSubject之間有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM