POCO エンティティでの変更の追跡 (Entity Framework)

POCO ("plain-old" CLR object) エンティティで変更を追跡するには、変更追跡プロキシ オブジェクトを使用する方法と、スナップショットを使用する方法の 2 種類があります。

プロキシを使用した変更追跡

変更追跡プロキシ オブジェクトの作成が POCO エンティティに対して有効になっている場合、オブジェクト グラフに対して行われる変更は、発生するたびに Entity Framework によって自動的に追跡されます。 詳細については、「POCO プロキシの作成要件 (Entity Framework)」および「ID 解決、状態管理、および変更の追跡 (Entity Framework)」を参照してください。 POCO クラスの追加の必要条件を満たすことができないか、これらのプロキシ オブジェクトが具体化されないようにするには、プロキシ クラスの生成を無効にできます。 詳細については、「POCO エンティティの使用 (Entity Framework)」を参照してください。

スナップショットを使用した変更追跡

プロキシ オブジェクトの作成が無効になっている場合、オブジェクト グラフに対して行われる変更は、発生するたびに Entity Framework によって自動的に追跡されません。 代わりに、DetectChanges メソッドを使用して変更を報告する必要があります。

オブジェクトがコンテキストにアタッチされている場合は、そのプロパティ値のスナップショットが取得されます。 DetectChanges メソッドが呼び出されると、アタッチされているオブジェクト グラフが ObjectStateManager と同期されます。 オブジェクトのアタッチ方法については、「オブジェクトのアタッチとデタッチ (Entity Framework)」を参照してください。 DetectChanges メソッドは、次のアクションを実行することで、オブジェクト グラフと状態マネージャーを同期します。

  1. グラフ内の新しいオブジェクトをオブジェクト コンテキストにアタッチする。 これは、プリンシパル オブジェクトのクエリを実行し、新しい依存オブジェクトとのアソシエーションを作成した場合に発生することがあります。

  2. 現在のプロパティ値と元の値のスナップショット (スナップショットが既に取得されている場合) との比較に基づいて、オブジェクトの状態を更新する。

詳細については、「方法: POCO エンティティの変更を検出する」を参照してください。

Dd456848.note(ja-jp,VS.100).gif注 :
POCO エンティティに複合型プロパティが含まれている場合、複合型インスタンスのメンバーに対する変更は、エンティティに変更追跡プロキシが存在する場合でも、スナップショット手段により検出されます。ただし、複雑型の新しいインスタンスがプロパティに割り当てられている場合、プロパティの変更は、他のプロパティと同じように追跡されます。

オブジェクトと ObjectStateManager が同期されていないと、オブジェクトの追加、アタッチ、または削除、Refresh メソッドの呼び出し、あるいは PreserveChangesMergeOption 値を使用したクエリの実行など、ObjectStateManager を使用した他の操作の結果が予期しないものになる場合があります。

アタッチされている POCO エンティティの値に対する変更と ObjectStateManager の同期を取ることは重要であるので、既定では SaveChanges メソッドは最初に DetectChanges メソッドを呼び出します。 グラフおよびプランを変更して次のいずれかのメソッドを使用する場合は、SaveChanges を呼び出す前に、DetectChanges を呼び出すことをお勧めします。

参照

概念

POCO エンティティの使用 (Entity Framework)