5

私は何の結果もなしにこのプログラムをデバッグしていますが、残念ながら私は問題の根本を見ることができません。この例外が発生する:ObjectContextインスタンスが破棄され、接続が必要な操作に使用できなくなる。エンティティのフレームワーク - オブジェクトコンテキスト例外を除外

2つのテーブルがあります: - CustomerSet - OrderSet

は、OrdersテーブルにCUSTOMER_IDという名前のフィールドは、テーブル間の関係を保証し、顧客と呼ばれる仮想ナビゲーションプロパティは、同様にOrdersテーブルにあります。私は、Ordersテーブルに要素を挿入 :

シナリオは以下のとおりです。Insertメソッド内

Order order = new Order(); 
Order.order_id = GenerateId(IdType.Order); 
Order.date = DateTime.Now; 
Order.Customer_id = GetCustomerId(tbCustomerName.Text); 
Insert(order); 

は、usingステートメントでDBContextがあるので、必要なときに自動的に廃棄してください。私はこれの内部で働く。

その後、前に挿入した要素のデータが必要です(たとえば、Customerフィールドのプロパティが必要です)。

Order o = GetOrder(order.order_id); 

そして、私は顧客分野での例外を使用してこのOを得た:o.Customerは型「System.ObjectDisposedException」

の例外をスローした そして今、私は、お客様のフィールドに値を得たことを願っています

私は怠惰なローディングでそれをオンまたはオフにしていましたが、うまくいきませんでした。状況は同じです...

私は何を混乱させるのですか?

私はF11でステップバイステップを行っても、それはしばしば正しく動作します。

助けてください!前もって感謝します。 Insertメソッド内

+0

あなたはどのようにの知識がなくても、あなたのコードのいくつかの詳細を投稿する必要があるということを確認してくださいとして罰金ですDbContextオブジェクトを取得しているときに、何が起こっているのかを知ることは不可能です。 –

答えて

4

ないまさに「必要な時」

を必要なときに自動的に処分するようDBContextは、usingステートメントであります。文脈オブジェクトのIDisposable.Dispose()は、usingブロックの範囲外になるとすぐに呼び出されます。その後

、私はあなたのコンテキストは、この時点で配置されている、以前に挿入された要素

からのデータを必要としています。アクションが遅延ロードを必要とする場合、遅延ロードを実行するためのコンテキストが使用できないため、失敗します。

一般的に、ロードされていないオブジェクトにアクセスする必要がある場合は、残りのオブジェクトグラフを取得するときに.Includeをロードするのが最も効率的な方法です。それは熱心な読み込みと呼ばれます。

残りのオブジェクトグラフを読み込むときに読み込まれないオブジェクトにアクセスする必要がある場合は、新しいコンテキストが必要になります。ロードに関連するオブジェクトの説明については

、私はあなたがInsert内usingステートメントを使用している場合は、コンテキストがなくなっている

http://msdn.microsoft.com/en-us/data/jj574232.aspx

+1

これは正常に問題を解決しました。クール機能。どうもありがとうございます! –

0

を示唆しています。

限り、あなたはInsert()order.order_idの一環として、新しいIDを取得し、GetOrder()火災アップ新しいコンテキスト

関連する問題