1

誰かが私を助けることができるのだろうか?

POCO (非プロキシ) エンティティで DetectChanges を発行する必要がある理由を理解するのに問題があります。

もちろん、プロキシが返されないようにするためにこの行があります。

   context.ObjectStateManager.GetObjectStateEntry(order).State

そして、いくつかの調査を行うと、オブジェクトの「状態」を確認する必要がある場合は、detechChanges を発行する必要があるように見えますが、なぜオブジェクトの状態を確認する必要があるのでしょうか?

基本的に、データを新しい ObjectContext に保存するメソッドに POCO エンティティを送信します (各メソッドで ObjectContext を作成および破棄します)。

したがって、なぜ ObjectContext を追跡したり、変更を認識したりする必要があるのか​​ を理解するのに問題がありますか?

気づかないと救われないからでしょうか。

たぶん私は知らされていませんが、既存のObjectContextを使用している場合(私は毎回作成および破棄していません)、ObjectContextが確実に認識されるようにすることは有益ですが、そうでない場合はそうではありませんか?

したがって、1 つのメソッドでは、新しい datacontext を作成してオブジェクトを更新し、それを db に保存して ObjectContext を破棄しています。したがって、私は2つの方法を使用していません.1つの方法で更新または新しいレコードを送信し、次に別の方法で保存します。

なぜそれが必要なのか、簡単な説明をいただければ幸いです。

前もって感謝します

4

1 に答える 1

5

あなたの質問は少し混乱しています。あなたはEntity Frameworkについて書いていますが、LinqToSqlに関連するDataContextを使用しています。

動作は、ObjectContext の使用方法によって異なります。データベースから POCO エンティティをロードすると、ObjectContext はそのインスタンスを内部 ID マップに保持します。デフォルトでは、POCO はいかなる種類の変更追跡も使用しません。その POCO エンティティをObjectContextの同じインスタンスに保存すると、内部でDetectChangesが呼び出され、現在のエンティティの状態と保存された状態が比較されます。この比較により、どの列を更新する必要があるかが定義されます。DetectChanges への内部呼び出しは、オフにできるデフォルトの動作であるため、このメソッドを手動で呼び出す必要があります。

あなたのシナリオでは、ObjectContextの同じインスタンスを使用していません。その場合、最初に POCO エンティティを ObjectContext にアタッチする必要があります。MSDNは、エンティティをアタッチすると Unchanged としてマークされると厳密に述べています。そのため、エンティティが変更されたという ObjectContext を言う必要があります。エンティティ全体に対してそれを行うことも、変更されたプロパティを正確に定義することもできますが、手動で行う必要があります = その情報をどこかに保存する必要があります (自己追跡エンティティはそれを支援できますが、他の欠点があります)。

于 2010-10-11T08:06:46.580 に答える