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