オブジェクトのアタッチ (Entity Framework)

Entity Framework では、オブジェクト コンテキスト内でクエリを実行すると、返されたオブジェクトはそのオブジェクト コンテキストに自動的にアタッチされます。クエリ以外のソースから取得したオブジェクト コンテキストにオブジェクトをアタッチすることもできます。以前にデタッチされているオブジェクト、NoTracking クエリによって返されたオブジェクト、またはオブジェクト コンテキストの外部で取得したオブジェクトなどもアタッチできます。さらに、ASP.NET アプリケーションのビュー ステートに保存されていたオブジェクトや、リモート メソッド呼び出しまたは Web サービスによって返されたオブジェクトもアタッチできます。

オブジェクトをオブジェクト コンテキストにアタッチするには、次のいずれかのメソッドを使用します。

  • オブジェクトをオブジェクト コンテキストに追加するには、ObjectContextAddObject を呼び出します。この方法は、オブジェクトがデータ ソースに存在しない新しいオブジェクトである場合に使用します。

  • オブジェクトをオブジェクト コンテキストにアタッチするには、ObjectContextAttach を呼び出します。この方法は、オブジェクトが既にデータ ソースに存在するが、現在コンテキストにアタッチされていない場合に使用します。詳細については、「関連するオブジェクトをアタッチする方法 (Entity Framework)」を参照してください。

  • オブジェクト コンテキストで設定された特定のエンティティ セットにオブジェクトをアタッチするには、ObjectContextAttachTo を呼び出します。また、オブジェクトの EntityKey 値が null (Visual Basic では Nothing) の場合にもこの操作を行います。

  • ObjectContextApplyPropertyChanges を呼び出します。この方法は、オブジェクトが既にデータ ソースに存在し、デタッチしたオブジェクトに保存するプロパティ更新がある場合に使用します。オブジェクトをアタッチするだけでは、プロパティの変更は失われます。詳細については、「デタッチされたオブジェクト対して行われた変更を適用する方法 (Entity Framework)」を参照してください。

オブジェクト コンテキストにオブジェクトをアタッチする際は、次の点を考慮してください。

  • アタッチされるオブジェクトに関連オブジェクトがある場合、それらのオブジェクトもオブジェクト コンテキストにアタッチされます。

  • Attach を使用してオブジェクトをアタッチするには、オブジェクトが IEntityWithKey を実装し、有効なキーを持っている必要があります。

  • オブジェクトは Unchanged 状態でオブジェクト コンテキストにアタッチされます。

  • アタッチされたオブジェクトがデータ ソースに存在しない場合、そのオブジェクトは SaveChanges の実行時に追加されません。この場合、プロパティに変更が加えられると、SaveChanges の実行時にサーバーで例外が発生します。オブジェクトを追加するには、Attach の代わりに AddObject を使用します。

  • アタッチされるオブジェクトが他のオブジェクトに関連している場合、次のいずれかの方法でリレーションシップを明示的に定義する必要があります。

    • 両方のオブジェクトをオブジェクト コンテキストにアタッチし、EntityCollection または EntityReferenceAttach を呼び出して、リレーションシップを定義します。

    • どちらのオブジェクトもアタッチされていない場合は、EntityCollectionAdd を呼び出し、関連オブジェクトを指定するか、EntityReferenceValue プロパティを関連オブジェクトに設定します。次に、オブジェクト グラフのルートをオブジェクト コンテキストにアタッチします。この方法は、デタッチされたオブジェクトからオブジェクト グラフを構築し、グラフをオブジェクト コンテキストにアタッチする場合に使用できます。

    これらの方法は、XML シリアル化を使用してシリアル化された関連オブジェクトをアタッチするときに使用します。詳細については、「関連するオブジェクトをアタッチする方法 (Entity Framework)」を参照してください。

  • アタッチされるオブジェクトに更新済みのプロパティ値がある場合、既存のオブジェクトにその更新内容を適用するには、ApplyPropertyChanges を使用します。詳細については、「デタッチされたオブジェクト対して行われた変更を適用する方法 (Entity Framework)」を参照してください。

  • Attach メソッドに渡されるオブジェクトには、有効な EntityKey 値が必要です。オブジェクトに有効な EntityKey 値がない場合は、AttachTo メソッドを使用してエンティティ セットの名前を指定します。

  • アタッチされるオブジェクトと同じ EntityKey がオブジェクト コンテキストに別のオブジェクトとして既に存在する場合は、InvalidOperationException が発生します。同じオブジェクト インスタンスが既にオブジェクト コンテキスト内にある場合、このエラーは発生しません。Attach は、オブジェクトが Unchanged 状態にある限り、同じオブジェクト インスタンスで複数回呼び出すことができます。

  • オブジェクトを特定のエンティティ セットにアタッチするには、AttachTo メソッドを使用します。詳細については、「オブジェクトの追加、変更、および削除 (Entity Framework)」を参照してください。

  • AttachTo メソッドを使用してアタッチされたオブジェクトのエンティティ キーが既に定義されている場合、entitySetName パラメータの値が既存のキー内のエンティティ セット名と一致しないと、InvalidOperationException が発生します。

参照

概念

オブジェクトのデタッチ (Entity Framework)
Web サービスおよび Entity Data Model (アプリケーション シナリオ)

その他のリソース

オブジェクト コンテキストの管理 (Entity Framework)