2016-05-23 12 views
0

後に消える:例外は、私は次のコードを持って反復

using (context = new DBEntities()) 
{ 
    var ordersEnt = context.Orders.Include("Clients"); 
    return ordersEnt.ToArray(); 
} 

Clientsに含まれるクライアント情報が表示されませんが、私はこの例外を受けています:

System.ObjectDisposedException:ObjectContextインスタンスが破棄され、接続が必要な操作に使用できなくなりました。

私はコードがusing()であるので、コードの後に​​オブジェクトが配置されているusing句を残してからだと理解しています。私は、エラーが消えstring clientNameの任意のさらなる使用とClientsディスプレイに含まれるクライアント情報をせずに

foreach (var order in ordersEnt) 
{ 
    string cliName = order.Clients.ClientName; 
} 

を追加する場合

なぜ反復処理で問題が解決されるのですか?注文結果を反復することなくこれを達成する方法はありますか?

+0

使用しているコードの中に上記のコードを追加しますか? – Marcel

+1

あなたの問題は、Eager/Lazyの読み込みと関係があります。私は頭の上からすぐに解決策を提示することはできませんが、これは目を向ける方向になります。 – Marcel

+0

@ Marcelはい、それは使用の中です。 –

答えて

1

これは、エンティティフレームワークが遅延読み込みを使用するためです。ときstring cliName = order.Clients.ClientName;

//your POCO class here 
class Order 
{ 
    public virtual Client Client { get; set; } 
} 

class Client 
{ 
    public string Name { get; set; } 
} 

//the framework uses something like this 
class Order_Proxy : Order 
{ 
    public override Client Client 
    { 
     get 
     { 
      //return Client_Proxy when you access this property 
      //the query executes when accessing 
     } 
     set { /*blabla*/ } 
    }    
} 

class Client_Proxy : Client 
{ 
    //a proxy wrapper like Order_Proxy 
} 

ので、クエリが起こる:ordersEnt.ToArray()は受注のみ、でもあなたはcontext.Orders.Include("Clients")を指定し、フレームワークはこのようなあなたのためのプロキシを作成します照会します。それがなければ、クエリは文脈が破棄されたusingブロックの外で発生し、したがって例外が発生します。

解決策データエンティティを発信者に公開しているようですが、それは良い考えではありません。 Web-APIや類似のものを構築する場合は、エンティティタイプをAPIの戻り値の型として使用しないでください。 APIクラスに新しいクラス(おそらくOrderという名前)を作成し、エンティティをマップします(AutoMapperなど)。 MyProject.Core.OrderMyProject.WebApi.Orderがあります。

+0

ありがとう!エンティティを新しいクラスにどのようにマップするのですか? –

+0

@DovMiller [AutoMapper](http://automapper.org/)を試してください。 –

関連する問題