1

EFオブジェクトをディープロードして、一定期間キャッシュに保持しようとしています。私の場合、オブジェクト(たとえばUser)があり、次に仮想コレクションとして設定された書籍の内部リストがあります

public virtual ICollection<Books> ListOfBooks { get; set; }

BooksとUserの間に外部キー関係がある場合(そしてそれはすべて正常に機能します)

これを静的な中央クラスにディープロードしようとしています

public static List<User> LoadAllBooksAndUsers() {

  using (MyDB dc = new MyDB())
  {

      dc.Users.Include("ListOfBooks");
      List<User> a = dc.Users.Where(l => l.Status == 1).ToList();

      return a;             
   }
}

私の呼び出しコードには、次のようなものがあります。

var evx = DB.LoadAllBooksAndUsers();
var q = evx.Single(m=>m.name==name);

デバッガーまたはq.ListOfBooksでevxを調べると、listOfBooksにオブジェクトが破棄された例外があり、nullであることがわかります。

そして、これはランダムです-それは時々動作するようで、私はどのような条件で動作するのかわかりません。

何が起こっているのかわかりません-.Include()を使用して列挙すると、依存するすべての外部キーオブジェクトが読み込まれるので、メソッドがすべての本をユーザーにディープロードしないのはなぜですか?私は何が欠けていますか?

(このオブジェクトのデータは頻繁に使用されるため、このオブジェクトをディープロードしてしばらくキャッシュしたいと思います)

4

1 に答える 1

3

Include間違った使い方をしています。それ自体ではなく、クエリ構築と一緒に使用する必要があります。

List<User> a = dc.Users.Include("ListOfBooks")
                       .Where(l => l.Status == 1)                           
                       .ToList();

熱心な読み込みについては、この記事で詳細を確認できます。

于 2012-05-18T05:06:41.580 に答える