2017-12-21 16 views
0

私はこの質問が何度か前に尋ねられたことは知っていますが、私の側では奇妙な振る舞いをしています。EF 6 codde first - One To Many Mapping - ICollection always null

私はまずEF6とコードで.Netアプリケーションを構築しています。

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int RefId { get; set; } 

    public int GradeId { get; set; } 
    public Grade Grade { get; set; } 
} 

public class Grade 
{ 
    private string _name; 

    public int GradeId { get; set; } 
    public string GradeName { get; set; } 

    public ICollection<Student> Students { get; set; } 
} 

私は遅延読み込みがEF 4を超えて、デフォルトで有効になっていることを理解し、ほとんどの仕事がある解決策を削除するには次のように私は(これらは、例えば、クラスですが、私はまったく同じ構造を持っている)私のクラスを定義しエンティティからの仮想キーワード(非仮想プロパティ)。

私の場合、Gradeクラスのgetterメソッドでカスタムコードを設定したいが、ICollection<Student> Studentsは常にnullです。例えば

public string GradeName 
{ 
    get 
    { 
     _name = Students.FirstOrDefault(s => s.GradeId == GradeId && 
           s.RefId == 2).Name; 

     if (string.IsNullOrWhiteSpace(_name)) 
     { 
      _name = Name; 
     } 

     return _name; 
    } 

    set => _name = value; 
} 

私はすべてを可能にしようとした、何も助けません。あなたが私にこの問題を解決するのを手助けできるなら、それは素晴らしいでしょう、ありがとう!

+0

'public' ** virtual **' ICollection Students {get;セット; } ' –

+0

これは動作しませんでした。 getterメソッドGradeNameでは、Studentsは常にnullです! –

+0

コンテキストからフェッチされた 'GradeName'を呼び出す' Grade'インスタンスはありますか? –

答えて

0

それはクラスの責任だとして、あなたは、コンストラクタで学生を初期化する必要があります。

public class Grade 
{ 
    public int GradeId { get; set; } 
    public string GradeName { get; set; } 

    public ICollection<Student> Students { get; set; } 

    public Grade() 
    { 
     Students = new Collection<Student>(); 
    } 
} 
+0

に投稿したカスタムゲッターからの値を返すべきです。これはnull参照例外を与えないようにコレクションを初期化しますが、関連するデータは含まれません。私はすでにそれを試しました –

0

あなたはイーガーローディング作品対どのように怠惰な誤解されています。 hereを参照してください。

コレクションのバーチャルにマークを付けると、それが延期されたことを意味します。

var studentWithGrade = context.Students 
      .Include(s => s.Grade) 
      .FirstOrDefault(s => s.GradeId == GradeId && s.RefId == 2); 

や学生のコレクションを持つグレード:

var gradeWithStudents = context.Grade 
      .Include(g => g.Students) 
      .ToList(); 

以上の組み合わせhereを含めることは、コレクションを移入しません削除、あなたはまだ含める必要があります。

+0

答えがありがとう、しかし私は私のケースではインクルードを使用することができます。私はgetterメソッドを意味します。学生はいつもヌルです、どうやってゲッターメソッドで使うのですか?私の質問をもう一度見てください。このステップでは、私はコンテキストオブジェクトを持っていません –

+0

あなたが達成しようとしているものを見ていないと思います。 Students.FirstOrDefault()を参照してください。そこには誰が住んでいるのですか? –

+0

私が以前に書いたコメントを貼り付けて、あなたが何をしたいのか分かります。 –