オブジェクトの作成、追加、変更、および削除 (Entity Framework)

オブジェクト コンテキスト内のオブジェクトは、データ ソース内のデータを表現するエンティティ型のインスタンスです。 オブジェクト コンテキスト内でオブジェクトを変更、作成、および削除できます。さらに、Entity Framework によってこれらのオブジェクトに対する変更が追跡されます。 SaveChanges メソッドを呼び出すと、Entity Framework によって、データ ソースに対して同等の挿入、更新、または削除ステートメントを実行するコマンドが生成されて実行されます。 詳細については、「変更の保存と同時実行制御の管理 (Entity Framework)」を参照してください。

ストアド プロシージャへの挿入関数、更新関数、および削除関数のマップ

Entity Framework を使用すると、エンティティ型の挿入、更新、および削除操作をストアド プロシージャにマップできます。 ストアド プロシージャをエンティティにマップする場合、この 3 つの操作をすべてマップすることをお勧めします。 たとえば、エンティティ型を挿入および更新ストアド プロシージャにマップし、削除ストアド プロシージャにマップしない場合、その型のオブジェクトを削除しようとすると、削除操作は実行時に UpdateException で失敗します。 詳細については、「How to: Map Modification Functions to Stored Procedures」および「Walkthrough: Mapping an Entity to Stored Procedures」を参照してください。

オブジェクトの作成と追加

データをデータ ソースに挿入する場合は、エンティティ型のインスタンスを作成してオブジェクトをオブジェクト コンテキストに追加する必要があります。 新しいオブジェクトをデータ ソースに保存するには、まず null 値をサポートしないすべてのプロパティを設定する必要があります。 Entity Framework によって生成されたクラスを使用する場合は、エンティティ型の CreateObjectName 静的メソッドを使用してエンティティ型の新しいインスタンスを作成することを検討してください。 Entity Data Model ツールでは、エンティティ型の生成時に各クラスにこのメソッドが含まれます。 この Create メソッドは、オブジェクトのインスタンスを作成し、クラスの null に設定できないすべてのプロパティを設定するために使用します。 このメソッドには、CSDL ファイル内で Nullable="false" 属性が適用されているすべてのプロパティに対するパラメーターがあります。 詳細については、「静的 Create メソッドを使用してオブジェクトを作成する方法 (Entity Framework)」を参照してください。

POCO ("plain-old" CLR objects) エンティティを使用する場合、new 演算子を使用せずに、CreateObject メソッドを使用して新しいオブジェクトを作成します。 CreateObject メソッドは、該当するプロキシ オブジェクトの新しい POCO インスタンスをラップします。 詳細については、「POCO エンティティの使用 (Entity Framework)」を参照してください。

新しいオブジェクトは、次のメソッドのいずれかを使用してオブジェクト コンテキストに追加できます。

  • ObjectSetAddObject メソッド。

  • ObjectContextAddObject メソッド。

  • EntityCollectionAdd メソッド。 Entity Framework によって生成されたエンティティおよびプロキシ オブジェクトの場合、追加されたエンティティは、プリンシパル オブジェクトがアタッチされるとコンテキストにアタッチされます。 POCO エンティティは、DetectChanges メソッドが呼び出されるとアタッチされます。

新しいオブジェクトを追加する際は、次の点に注意してください。

  • SaveChanges が呼び出される前に、すべての新しいオブジェクトに対して、Entity Framework によって一時的なキー値が生成されます。 SaveChanges が呼び出された後、このキー値は、新しい行の挿入時にデータ ソースで割り当てられる ID 値に置換されます。

  • エンティティのキー値がデータ ソースで生成されない場合は、一意の値を割り当てる必要があります。 2 つのオブジェクトに対してユーザーが同じキー値を指定していると、SaveChanges の呼び出し時に InvalidOperationException が発生します。 その場合は、一意の値を割り当てて操作を再試行する必要があります。

オブジェクトの削除

ObjectSet に対して DeleteObject メソッドを呼び出すか、ObjectContext に対して DeleteObject メソッドを呼び出すと、指定したオブジェクトが削除対象としてマークされます。 行は、SaveChanges が呼び出されるまではデータ ソースから削除されません。 Entity Framework でオブジェクトを削除する動作は、オブジェクトが属するリレーションシップの型に応じて異なります。

依存リレーションシップで、プリンシパル エンティティの主キーが依存エンティティの主キーの一部である場合、オブジェクトを削除すると、関連オブジェクトも削除される場合があります。 依存オブジェクトは、親オブジェクトとのリレーションシップが定義されていないと存在できません。 親オブジェクトを削除すると、子オブジェクトもすべて削除されます。 これは、リレーションシップに対するアソシエーションの <OnDelete Action="Cascade" /> 属性を有効にすることと同じです。

外部キーの関連付け (アソシエーション) として表される非依存リレーションシップでは、プリンシパル オブジェクトが削除されると、Entity Framework によって、null に設定できる依存オブジェクトの外部キー プロパティが null に設定されます。

詳細については、「OnDelete 要素 (CSDL)」および「リレーションシップの定義と管理 (Entity Framework)」を参照してください。

オブジェクトの変更

Entity Framework は、ObjectContext にアタッチされているオブジェクトに対する変更を追跡します。 Entity Data Model ツールでは、OnPropertyChanging および OnPropertyChanged という部分メソッドのペアが生成されます。 これらのメソッドはプロパティ setter 内で呼び出されます。 部分クラス内のこれらのメソッドを拡張して、プロパティの変更時にカスタム ビジネス ロジックを挿入します。 詳細については、「スカラー プロパティの変更時にビジネス ロジックを実行する方法 (Entity Framework)」を参照してください。 POCO エンティティの使用方法については、「POCO エンティティでの変更の追跡 (Entity Framework)」を参照してください。

オブジェクトを変更する際は、次の点に注意してください。

  • 複合オブジェクトのスカラー プロパティまたは複合プロパティを変更すると、最上位のエンティティ オブジェクトの状態が Modified に変更されます。 「POCO プロキシの作成要件 (Entity Framework)」で説明しているように、POCO エンティティがプロキシ生成の要件を満たしていない場合、変更されたプロパティの状態は、DetectChanges メソッドが呼び出されたときに Modified に変わります。

  • オブジェクトが Detached 状態の場合、変更は追跡されません。 オブジェクトは、NoTracking マージ オプションを使用するクエリによって返された場合、または Detach の呼び出しによって ObjectContext からデタッチされた後、この状態になります。

  • 外部キーの関連付け (アソシエーション) を変更すると、依存オブジェクトの状態が Modified に変わります。 独立した関連付け (アソシエーション) を変更しても、依存オブジェクトの状態は変わりません。

POCO エンティティにおける変更の追跡の詳細については、「POCO エンティティでの変更の追跡 (Entity Framework)」を参照してください。

特定の EntitySet へのオブジェクトの追加

1 つのエンティティ型が複数のエンティティ セットに属する場合があります。 たとえば、データベース内に同じスキーマを持つ 2 つのテーブルがある場合について考えてみます。 このような状況としては、バックアップ プロセスの効率を向上させるためにデータをパーティション分割した場合などが考えられます。 たとえば、顧客データが Customer テーブルと CustomerArchive テーブルにパーティション分割されているとします。CustomerArchive は、Customer と同じスキーマですが、6 か月以上発注していない顧客に対して使用されます。 Customer は毎晩バックアップされ、CustomerArchive は週に 1 回バックアップされます。 マッピングの観点から見ると、CustomerCustomerArchive は別々のエンティティ セットに属する必要があります。 Entity Framework では、1 つのエンティティ型が 1 つまたは複数のエンティティ セットに存在できるようにすることで、このシナリオをサポートしています。 詳細については、「EntitySet 要素 (CSDL)」を参照してください。

1 つのエンティティ型が複数のエンティティ セットに存在する場合、Entity Framework では、その型の新しいインスタンスを特定のエンティティ セットに追加できます。 .NET Framework Version 4 以降では、個々のモデルについて生成された ObjectContext クラスには、モデルのエンティティ セットを表す ObjectSet 型のプロパティがあります。 新しいオブジェクトをオブジェクト コンテキストに追加するには、AddObject メソッドを使用します。 詳細については、「ObjectSet の使用 (Entity Framework)」を参照してください。 .NET Framework version 3.5 SP1 では、AddObject メソッドを呼び出してオブジェクトをオブジェクト コンテキストに追加するときに、entitySetName の値を指定する必要があります。

このセクションの内容

オブジェクトを追加、変更、および削除する方法 (Entity Framework)

静的 Create メソッドを使用してオブジェクトを作成する方法 (Entity Framework)

参照

処理手順

Multiple-Entity-Sets-per-Type でモデルを定義する方法 (Entity Framework)
オブジェクトを追加、変更、および削除する方法 (Entity Framework)

概念

リレーションシップの定義と管理 (Entity Framework)
POCO エンティティの使用 (Entity Framework)
ObjectSet の使用 (Entity Framework)
ObjectSet の使用 (Entity Framework)
OnDelete 要素 (CSDL)