24

私はASP .NET MVCの世界ではかなり新しいです。たぶん、それは、私にとって、迷惑な問題の原因を自分自身に説明することができない理由です。Entity Frameworkが空のListではなくList <>を返すのはなぜですか?

私は、1対多数のリレーシップを持つ1つのクラスを持っています。

class MyClass{ 
    public List<OtherClass> otherClasses {get;set;} 
} 

私は、このクラスの1つのインスタンスを永続化していたとき、私はそれは空のリストとの関係>

<
MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() } 
context.myClass.Add(myClass); 

だ埋める問題は、私はそのインスタンスを取得しようとすると、ということである、とのために何らかの理由で、私はそのリストにアクセスしようとしましたが、システムは私にNull参照例外を与えます...

私の質問は何ですか?特にこの場合、私は空のリストでそれを維持していますか?

インスタンスがnullの場合、検証を避ける方法はありますか?

+0

エンティティフレームワーククラスは何ですか? –

答えて

21

エンティティにコンストラクタでこれらのリストを作成させる必要があります。 EFは従属コレクションを作成せず、そのようにすることを期待しています。

だから、あなたのケースでは、あなたはこのようなあなたのエンティティになるだろう:私が正しく理解していれば

class MyClass{ 
    public List<OtherClass> _otherClasses {get;set;} 

    public MyClass() { 
     _otherClasses = new List<OtherClass>(); 
    } 
} 
+0

これは間違いなく私の問題を解決します!ご協力いただきありがとうございます!したがって、EFは永続化された情報をロードする前にオブジェクトコンストラクタを呼び出しますか? –

+0

いいえ、EFはコンストラクタを「コール」しません。 C#は行います。オブジェクトが作成されるたびに、コンストラクタが呼び出されます。たとえEFがdbからオブジェクトを生成しても。 –

+0

ありがとう! –

16

otherClassesコレクションを仮想化します。これにより、EFはコレクションを遅延ロードできます。

class MyClass{ 
    public virtual List<OtherClass> otherClasses {get;set;} 
} 

それ以外の場合はIncludeメソッドを使用してください。

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo); 
+1

実際、遅延ロードは私の問題を解決します...しかし、私はJSONリクエストを使用しているときにCircular Reference Serialization Errorを与えていたので、遅延読み込みを避けようとしています。とにかく、私はあなたの助けを喜んでいます。ありがとう! –

+0

循環参照の問題では、 'JsonIgnore'のような属性を使用して、バックリンクナビゲーションプロパティが直列化されないようにすることができます。 – Jess

0

そう、あなたがコンテキストに空List<OtherClass>を追加し、それを取得しようとしています。

私は、コンテキストがそのコンテキストにあるエンティティをどのように追跡し、クエリするか考える必要があると思います。これは通常エンティティのKeyによって行われます。あなたの例では、エンティティにKeyを与えていないため、コンテキストにはというハンドルがありません。エンティティ上にというハンドルがあります。

したがって、クエリすると、コンテキストがオブジェクトを見つけず、nullを返します。

新しいエンティティを初期化する場合は、少なくともKey(通常はIdプロパティ)を指定し、後で参照するときはそのキーで選択することをお勧めします。

これが役に立ちます。

+0

実際、私の本当のクラスはすべてID属性。それは私がID:Pを含めるのを忘れた例にすぎませんでした。とにかく、あなたの答えをありがとう! –

関連する問題