EntityFrameworkを使って、MVC3と組み合わせて以下を試しています。
すべてObjectContext
のリクエストの開始時に初期化され、リクエストの最後に破棄される があります。単純なUnitOfWork
実装によく似ています。ここで、Order
初期化されるクラス (EF 生成) があるとします。ObjectContext
オーバーロードされたコンストラクターを介して使用されるを渡します。
var order = new Order(myObjectContext);
次に、Order
クラス内でこのインスタンスが保持されます (プライベート フィールド)。Order
このインスタンスのいくつかのプロパティを設定した後(同じ を使用ObjectContext
)。注文を保存する準備が整う前に、いくつかの情報を入力するために 2 番目の Web ページが必要なため、このインスタンスをユーザーのセッションに配置したいと考えています。
ユーザーが 2 番目の Web ページを送信した後、セッションからオブジェクトを取得し、さらにいくつかのプロパティを設定して、オブジェクトによる参照Order
をヒット.SaveChanges()
します。最初のリクエストで作成したものです。最初のリクエスト中 (が作成されたとき) に、他のいくつかのエンティティが注文コレクションの 1 つに追加されているため、これが必要だと思います。そのため、同じコンテキストを再度使用する必要があります。問題は、メソッドをヒットした後、エラーは返されず、データがデータベースに保存されないことです。ID 値でさえゼロから変化しません。何もコミットされていません。ObjectContext
Order
Order
.SaveChanges()
最初にオブジェクトをコレクションに追加しようとしたとき:
this._context.Order.AddObject(this);
this._context.SaveChanges();
このコードはメソッド内にあり、部分的な Order クラスに配置されていることに注意してください。今回は、.AddObject()
次のメッセージが表示されます。
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
オブジェクトを元のコンテキストから切り離し、Order
2 番目のリクエストで作成されたコンテキストに再アタッチしようとしましたが、Order
プロパティの 1 つが他のエンティティのコレクションであり、最初のリクエストで取得および追加されたため、もちろんこれは機能しません。最初のObjectContext
。
.SaveChanges()
おそらく、最初のリクエストの最後に電話することで、この問題を解決できたでしょう。次に、次のリクエストで、そのリクエストの .xml を使用してデータベースから注文を取得する必要がありObjectContext
ます。Order
問題は、2番目のリクエストが終了する前に保存したくないということです。
私には、セッション内ObjectContext
のインスタンスに保持されているのOrder
は「接続の更新」が必要なように見えますか?