web-dev-qa-db-ja.com

Entity Frameworkが空のリストではなくnull List <>を返すのはなぜですか?

私はASP .NET MVCの世界ではかなり新しいです。たぶん、それが私にとって自分にとって迷惑な問題の原因を自分で説明できない理由です。

私には1対多の嫌悪感を持つ1つのクラスがあります。

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

このクラスの1つのインスタンスを永続化しているとき、その関係を空のList <>で埋めます

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

問題は、そのインスタンスを取得しようとすると、何らかの理由でそのリストにアクセスしようとすると、システムからNull参照例外が発生することです...

私の質問は、EFがnullリストの代わりに空のリストを返さないのはなぜですか?特にこの場合、空のリストでそれを永続化しているのですか?

インスタンスがnullかどうかの検証を回避する方法はありますか?

30
igor.araujo

これらのリストは、エンティティーでコンストラクターに作成する必要があります。 EFは依存コレクションを作成せず、エンティティが作成することを期待します。

したがって、あなたの場合、あなたはあなたのエンティティをこのようにするでしょう:

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

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

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

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

それ以外の場合は、Includeメソッドで積極的なロードを使用します。

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo);
16
Eranga

したがって、私が正しく理解していれば、空のList<OtherClass>をコンテキストに戻し、それを取得しようとしています。

コンテキストがそのコンテキスト内のエンティティを追跡および照会する方法について考える必要があると思います。これは通常、エンティティのKeyによって行われます。この例では、エンティティにKeyを指定していないため、コンテキストにはエンティティのhandleがありません。

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

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

お役に立てれば。

0
Davin Tryon