2017-08-18 11 views
1

Entity Frameworkのコードファーストを初めて使用しました。これは、データベース作成のためのコードファーストを使用して、ASP.NET MVCで学んだことです。私は、外部キーSubjectIdSubjectテーブルを参照しているStudentテーブルへStudentレコードを挿入しようとしているASP.NET MVCでEntity Frameworkを使用して外部キーを持つテーブルにレコードを挿入する方法

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; } 
} 

は、私は2つのクラスがあります。

私は2つの方法でそれをしようとしている:

まずアプローチ

ここ
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(); 
} 

私はSubjectId=202を持つ新しいSubjectインスタンスを作成しました。今すぐStudentオブジェクトを作成し、値202をSubjectIdに割り当てると、Insertの文の競合が発生します。 SubjectId = 202を持つSubjectがありますが、なぜインサートの衝突がありますか?私がデバッグすると、ナビゲーションプロパティ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(); 
} 

しかし、私はnull参照例外

オブジェクト参照がオブジェクト

のインスタンスに設定されていない取得するのはなぜ nullはここですか?

だからここに私の質問は以下のとおりです。

  1. StudentクラスのSubjectIdは何を意味するのでしょうか?私。その価値は何に関係していますか?明示的に設定することはできますか?はいの場合は、Subjectテーブルの主キーを参照しますか?そうでない場合は、EFコード慣行の目的にのみ指定されていますか?

  2. 同様に、ナビゲーションプロパティの役割は何ですか?なぜそれがヌルで、ヌルにならないのでしょうか?

ナビゲーションプロパティの基本的な理解は、EFが2つのエンティティ間の関係を決定するために使用されるということです。

誰もが非常に感謝される例で少し明確にしていただけますか?

+1

あなたのStudentクラスにSubjectIdは存在しません。おそらくあなたは[多対多](http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx)を探しているでしょう:学生は、多くの科目、科目は多くの生徒を持つことができます。 –

+0

'学生 'では、'科目 'コレクションを仮想としてマークしてください。 – Tipx

+0

@Tipx - バーチャルは、[遅延読み込み](https://stackoverflow.com/questions/15247614/understanding-code-first-virtual-properties)が必要な場合にのみ必要です。それは問題ではありません。 –

答えて

1

あなたは基本的に両方のあなたのアプローチでは、新しいStudentを作成し、新しいSubjectています。しかし、あなたが本当にやろうとしていることから、新しいStudentを作成し、それにSubjectSubjectId = 202)を割り当てます。あなたのStudentクラスの

SubjectIdは、このセットアップでは全く意味がありません - あなたは1持っているので:StudentSubject間の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の関係が確立される。

+0

私はこのようにすることはできません。新しい 'Subject'を作成し、' SaveChanges'を呼び出し、次に 'Student'捕捉対象を作成し、この' subject'を新しい 'Student'に追加します。 –

関連する問題