オブジェクトのカスタマイズ (Entity Framework)
ADO.NET エンティティ フレームワーク は、エンティティ データ モデル (EDM) の概念スキーマ定義言語 (CSDL) ファイルに基づいたオブジェクト レイヤを自動的に生成するツールを提供します。これらのデータ クラスは、アプリケーションの要件に応じてさまざまなレベルでカスタマイズできます。独自のカスタム データ クラスを変更して EDM で使用することもできます。これは、既存のアプリケーションのデータ クラスをアップグレードして エンティティ フレームワーク を使用する場合や、データ クラスの作成方法を詳細に制御する場合に便利です。
部分データ クラスの拡張
EDM で定義された型は、オブジェクト指向プログラミングで使用されるクラスのようにメソッドが関連付けられていません。これらの型に含めることができるのは、EDM で定義されたプロパティだけです。生成された部分データ クラスを拡張して、オブジェクトに機能を追加できます。エンティティ データ モデル ツールによって生成されたデータ クラスは、部分クラスに実装されます。部分クラスによって、クラスの定義が複数のソース ファイルに分割されます。各ソース ファイルにはクラス定義のセクションがあり、アプリケーションのコンパイル時にすべてのセクションが結合されます。詳細については、「Partial (Visual Basic)」または「partial (型) (C# リファレンス)」を参照してください。
部分クラスを有効にすると、生成されたファイルが更新されるときに独自のカスタマイズ処理が失われることを心配することなく、これらのクラスを個別のソース ファイル内のカスタム メソッドとプロパティで拡張できます。詳細については、「生成されたデータ オブジェクトをカスタマイズする方法 (Entity Framework)」を参照してください。
カスタム ビジネス ロジック
生成されたデータ クラスを使用すると、プロパティやリレーションシップの変更など特定の Object Services 操作の際にカスタム ビジネス ロジックを呼び出すことができます。たとえば、このビジネス ロジックには、プロパティが変更されたり SaveChanges が呼び出されたときに、新たに検証やログ作成を行う操作を含めることができます。カスタム ビジネス ロジックは、Object Services によって発生したイベントを処理するか、プロパティが変更されたときに呼び出されるカスタムの部分メソッドを定義することによって呼び出すことができます。
カスタム ビジネス ロジックを呼び出すために使用するイベントおよびメソッドを次に示します。
- OnPropertyChanging および OnPropertyChanged 部分メソッド
プロパティが変更されたときに Object Services によって呼び出される生成されたデータ クラス上の部分メソッドのペア。部分データ クラス内のこれらのメソッドを拡張して、プロパティが変更されたときに実行されるコードを実装します。詳細については、「プロパティの変更時にビジネス ロジックを実行する方法 (Entity Framework)」を参照してください。
- SavingChanges イベント
オブジェクト コンテキストにキャッシュされた変更がデータ ソースに保存される際に発生するイベント。このイベントを処理して、SaveChanges 操作の開始時にカスタム ビジネス ロジックを実装します。詳細については、「変更を保存するときにビジネス ロジックを実行する方法 (Entity Framework)」を参照してください。
- OnContextCreated メソッド
Entity Data Model ツールによって、モデルの EntityContainer を表し、ObjectContext から派生したクラスの OnContextCreated 部分メソッドが生成されます。この部分メソッドは、ObjectContext が初期化されるたびに呼び出されます。SavingChanges イベントのハンドラを登録するコードにこの部分メソッドを実装します。詳細については、「変更を保存するときにビジネス ロジックを実行する方法 (Entity Framework)」を参照してください。
- AssociationChanged イベント
2 つのオブジェクト間のリレーションシップが変更されたときに発生するイベント。このイベントを処理して、リレーションシップが変更されたときにカスタム ビジネス ロジックを実装します。詳細については、「オブジェクト間のリレーションシップを変更する方法 (Entity Framework)」を参照してください。
カスタム データ クラス
メソッドとプロパティを追加して部分クラスを拡張しただけでは十分な柔軟性が得られない場合もあります。アプリケーションでの使用を目的としてデータベースのデータを CLR オブジェクトに読み込むために ADO.NET を使用する既存の .NET Framework アプリケーションを検討してください。これらのオブジェクトには、オブジェクト レイヤで保持する必要のある重要なカスタマイズおよびビジネス ロジックが含まれている場合があります。これらのカスタマイズが原因で、エンティティ フレームワーク の使用を目的としたアプリケーションの移行が制限されることがあります。また、生成された部分クラスを単に拡張するのではなく、エンティティ型を詳細に制御する必要が生じる場合もあります。
EDM でカスタム データ クラスを使用する場合は、EntityObject を継承することをお勧めします。EntityObject を継承できない場合や、フレームワークからの独立性が要求される場合は、EDM 内でカスタム データ クラスを使用するために実装できる Entity Framework のインターフェイスのセットを使用します。詳細については、「カスタム データ クラス インターフェイスの実装 (Entity Framework)」を参照してください。カスタム データ クラスを使用する場合、カスタム データ クラスおよびプロパティに属性を適用して、プロパティを変更する際にオブジェクト コンテキストに通知する必要があります。
EntityObject の継承
生成されたデータ クラスは、EntityObject または ComplexObject を継承します。EDM でカスタム データ クラスを使用する必要がある場合は、データ クラスを変更して、これらの 2 つの基本クラスのどちらかを継承することをお勧めします。この方法では、EntityObject によって提供される変更追跡およびリレーションシップ管理機能をカスタム データ クラスで活用できます。
EntityObject および ComplexObject を継承するときは、以下の点に注意してください。
クラスおよびプロパティの名前は、EDM の概念スキーマ定義言語 (CSDL) ファイルで定義されているエンティティ型およびプロパティの名前に一致する必要があります。名前が一致しない場合は、データ クラスとプロパティの名前を変更するか、CSDL および関連付けられたマッピング スキーマ ファイル (MSL) 内の名前を更新する必要があります。詳細については、「カスタム オブジェクトを操作できるように Entity Data Model をカスタマイズする方法 (Entity Framework)」を参照してください。
CSDL で定義されているエンティティ型の各プロパティに対して、カスタム データ クラス内に関連付けられたプロパティが存在する必要があります。カスタム データ クラスには、CSDL で定義されたプロパティにマップしない追加のプロパティを設定できます。
カスタム データ クラスとプロパティに属性を適用する必要があります。これらの属性は、オブジェクトと CSDL の間の明示的なマッピングを提供します。詳細については、「オブジェクトとエンティティのマッピング属性 (Entity Framework)」および「カスタム オブジェクトをエンティティにマップする方法 (Entity Framework)」を参照してください。
Object Services を有効にしてカスタム オブジェクトへの変更を追跡するには、EntityObject 変更報告メソッドを使用して、特定のパターン内の変更を報告する必要があります。詳細については、「カスタム データ クラス内の変更の報告 (Entity Framework)」を参照してください。
Entity Framework ツールでは、オブジェクトのプログラミングを簡略化する追加クラスを生成することもできます。このコードとカスタム データ クラスを活用できます。詳細については、「カスタム オブジェクトで Object Services を使用する方法 (Entity Framework)」を参照してください。
EntityObject を継承する場合、ComplexObject を継承して複合型を実装する必要があります。詳細については、「複合型オブジェクト (Entity Framework)」を参照してください。
次の例は、EntityObject を継承するカスタム データ クラス Order を定義します。
<EdmEntityTypeAttribute(NamespaceName:="Microsoft.Samples.Edm", Name:="Order")> _
Public Class Order
Inherits EntityObject
[EdmEntityTypeAttribute(NamespaceName="Microsoft.Samples.Edm",Name="Order")]
public class Order : EntityObject
詳細については、「EntityObject および ComplexObject 基本クラスを継承する方法 (Entity Framework)」を参照してください。
このセクションのトピック
参照
その他のリソース
Object Services (Entity Framework)
カスタム オブジェクトの使用 (Entity Framework タスク)