12

私はEntity Frameworkのコードファーストが初めてです。これは、データベースの作成にコード ファーストを使用して、ASP.NET MVC で学んだことです。

私は2つのクラスを持っています:

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レコードを挿入しようとしています。StudentSubjectIdSubject

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

ここでは、新しいSubjectインスタンスを作成しましたSubjectId=202。オブジェクトを作成し、Student値 202 を に割り当てるSubjectIdと、Insertステートメントの競合が発生します。SubjectwithがありますSubjectId = 202が、挿入の競合があるのはなぜですか? Subjectsデバッグすると、ここでナビゲーション プロパティが null であることがわかります。ここの要点がわかりません。

2 番目のアプローチ:

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参照例外が発生します

オブジェクト参照がオブジェクトのインスタンスに設定されていません

stu.Subjectsヌルがここにあるのはなぜですか?

ここでの私の質問は次のとおりです。

  1. SubjectIdin Studentclass とはどういう意味ですか? つまり、その値は何に関係していますか? Subject明示的に設定できますか? はいの場合、テーブルの主キーを参照しますか? いいえの場合、EF コード規則の目的でのみ指定されていますか?

  2. 同様に: ナビゲーション プロパティの役割は何ですか? null になるのはなぜですか? null にならないのはいつですか?

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

誰でも、例を挙げて少し明確にしていただければ幸いです。

4

1 に答える 1