6

私は何の結果もなくこのプログラムをデバッグしてきました、そして残念ながら私は問題の根本を見ることができません。この例外が発生します。ObjectContextインスタンスが破棄され、接続を必要とする操作に使用できなくなりました。

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

OrdersテーブルのCustomer_idという名前のフィールドは、テーブル間の関係を保証します。また、OrdersテーブルにもCustomerという仮想ナビゲーションプロパティがあります。

シナリオは次のとおりです。Ordersテーブルに要素を挿入します。

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

Insertメソッド内のusingステートメントにはDBContextがあるため、必要に応じて自動的に破棄されます。私はこの中で働いています。

その後、以前に挿入された要素からのデータが必要です(たとえば、Customerフィールドのプロパティが必要です)。そして今、私は顧客フィールドが価値を得ることを望んでいます:

Order o = GetOrder(order.order_id);

そして、私はこれを取得しましたo顧客フィールドの例外:o。顧客はタイプ'System.ObjectDisposedException'の例外をスローしました

遅延読み込みをオンまたはオフにして遊んでいましたが、うまくいきませんでした。状況は同じです...

何を台無しにするのですか?

これで本当に素晴らしいのは、F11を段階的に実行すると、正しく機能することが多いということです。

助けてください!前もって感謝します。

4

2 に答える 2

6

Insertメソッド内のusingステートメントにはDBContextがあるため、必要に応じて自動的に破棄されます

正確には「必要なとき」ではありません。ブロックIDisposable.Dispose()のスコープから外れるとすぐにコンテキストオブジェクトを呼び出します。using

その後、以前に挿入した要素からのデータが必要です

この時点でコンテキストは破棄されます。アクションで遅延読み込みが必要な場合、遅延読み込みを実行するためのコンテキストが利用できないため、これは失敗します。

通常、ロードされていないオブジェクトにアクセスする必要がある場合、最も効率的なアプローチは.Include、オブジェクトグラフの残りの部分を取得するときに、オブジェクトをロードするために使用することです。これは、イーガーローディングと呼ばれます。

オブジェクトグラフの残りの部分をロードするときにロードされないオブジェクトにアクセスする必要がある場合は、新しいコンテキストが必要になります。

関連するオブジェクトの読み込みについては、

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

于 2013-03-18T19:54:27.323 に答える
0

内にusingステートメントがある場合Insert、コンテキストは失われます。

Insert() order.order_idの一部として新しいIDを取得し、それGetOrder()が新しいコンテキストを起動することを確認する限り、これは問題ありません。

于 2013-03-18T19:57:22.257 に答える