3

多くの関係を持つエンティティの大規模な階層をデータベースから取得する必要があります。多数Includesの . しかし、私はそれを機能させるのに苦労しています。(ちなみにEF5とPOCOを使用しています)。

簡単な例として、「フィックスアップ」手法を使用して、顧客とそれに関連するすべての注文を取得しようとしています。これは、BLL層で私がやっていることです:-

var customer = context.Customers
    .Where(o => o.Id == requestedCustomerId).SingleOrDefault();

customer.Orders = context.Orders
    .Where(o => o.CustomerId = requestedCustomerId).ToList();

UI 層に返された顧客エンティティを調べると、customer.Orders は ObjectDisposedException を返します。私は何を間違っていますか?

fixup がどのように使用されるかのさらなる例として、注文に関連する OrderLines をどのように入力しますか (別のクエリで、または上記の 2 番目のクエリの一部として)? また、OrderLine エンティティに ProductCategory 親エンティティがある場合はどうすればよいでしょうか? これらをどのように設定すればよいでしょうか?

アップデート

私はちょうど動作する次のことを試しました: -

var orders = context.Orders
    .Where(o => o.CustomerId = requestedCustomerId).ToList();

var customer = context.Customers
    .Where(o => o.Id == requestedCustomerId)
    .Include("Orders")
    .SingleOrDefault();

2 番目のクエリはデータベースから Orders を再度フェッチせず、EF は前のクエリによって取得されたものを関連付けます (任意の変数に座っているだけでも)。

4

1 に答える 1

4

例外はおそらく、ObjectDisposed遅延読み込みがオンになっていて、アクセスしようとする前にコンテキストを破棄しているためですcustomer.Orders。私は遅延読み込みが好きではないので、常にオフにしています。

// in your context constructor:
this.Configuration.LazyLoadingEnabled = false;

元の例が機能するはずです。


更新では、句を熱心にロードCustomer.Ordersしています。これは、EF がレコードを取得するときにIncludeを使用してデータベースからこのデータを取得していることを意味します。joinCustomer


編集:

DbContextオブジェクトは基本的にデータベース行です。

Orders特定のものに関連付けられたをロードすると、コンテキストはそれらのオブジェクトをCustomer記憶します。Order

その後Customerオブジェクトをフェッチすると (なしで)、EF は、以前にフェッチしたオブジェクトをオブジェクト.Include( "Orders" )にアタッチするのに十分なほどスマートです。OrderCustomer

Orderオブジェクトには があるため、これを行うことができますCustomerId。そのオブジェクトを取得するとCustomer、そのプロパティを調べて、オブジェクトをコレクションCustomerIdに追加できます。OrderCustomer.Orders

Orders知っているもののみを添付するOrderため、何らかの理由で関連付けられているすべてのレコードを以前にロードしていない場合、EF は確認したレコードのみを添付します。

于 2013-01-14T11:46:51.857 に答える