POCO エンティティの使用 (Entity Framework)
Entity Framework では、データ クラス自体を変更しなくても、カスタム データ クラスとデータ モデルを一緒に使用できます。 つまり、既存のドメイン オブジェクトなどの POCO ("plain-old" CLR object) をデータ モデルで使用できます。 データ モデルに定義されているエンティティにマッピングされる、これらの POCO データ クラス (永続化非依存オブジェクトとも呼ばれる) は、support most of the same query, insert, update, and delete behaviors as entity types that are generated by the Entity Data Model ツールによって生成されるエンティティ型と同じクエリ、挿入、更新、および削除の動作のほとんどをサポートしています。
マッピング要件
データ モデルで POCO エンティティを使用するには、エンティティ型の名前をカスタム データ クラスと同じにする必要があり、エンティティ型の各プロパティは、カスタム データ クラスのパブリック プロパティにマッピングする必要があります。 型の名前とマッピングされる各プロパティは、同等である必要があります。 概念モデルのエンティティの変更方法については、「How to: Create and Modify Entity Types」を参照してください。
注 : |
---|
POCO エンティティのマッピングは、アセンブリ レベルの EdmSchemaAttribute を含むカスタム データ クラスにマッピング属性が適用される場合には、サポートされません。 |
プロキシ オブジェクトの作成
POCO クラスが変更されたときに Entity Framework に変更を追跡させ、また関連するオブジェクトの遅延読み込みをサポートさせるには、POCO クラスが「POCO プロキシの作成要件 (Entity Framework)」で説明されている要件を満たしている必要があります。
プロキシ オブジェクトの作成が POCO エンティティに対して有効になっている場合、グラフおよびオブジェクトのプロパティ値に対して行われる変更は、発生するたびに Entity Framework によって自動的に行われます。 プロキシを使用した場合と使用しない場合の変更追跡オプションについては、「POCO エンティティでの変更の追跡 (Entity Framework)」を参照してください。
POCO エンティティとプロキシ エンティティ オブジェクトは混合できます。 プロキシ オブジェクトの作成を無効にするには、ObjectContext の ContextOptions プロパティによって返される ObjectContextOptions のインスタンスで、ProxyCreationEnabled プロパティの値を false に設定します。
' Disable proxy object creation.
context.ContextOptions.ProxyCreationEnabled = False
// Disable proxy object creation.
context.ContextOptions.ProxyCreationEnabled = false;
詳細については、「方法: プロキシを持つ POCO エンティティを作成する (Entity Framework)」を参照してください。
POCO プロキシのシリアル化
Windows Communication Foundation (WCF) では、プロキシを直接、シリアル化または逆シリアル化できません。その理由は、DataContractSerializer では既知の型のみのシリアル化または逆シリアル化ができますが、プロキシ型は既知の型ではないためです。 POCO エンティティをシリアル化する必要があるときは、プロキシの作成を無効にするか、ProxyDataContractResolver クラスを使用して、プロキシ オブジェクトを元の POCO エンティティとしてシリアル化します。 プロキシの作成を無効にするには、ProxyCreationEnabled プロパティを false に設定します。
ProxyDataContractResolver クラスでは、シリアル化の最中にプロキシ型を POCO 型にマッピングします。 サービス操作で ProxyDataContractResolver クラスを使用するように DataContractSerializer に指示するには、ProxyDataContractResolver を内部で使用する属性クラス (サービス操作に適用されるクラス) を定義し、プロキシ型を純粋な POCO 型にマッピングします。 この属性クラスは、WCF アプリケーション内のサービス コントラクトの一部であるメソッドに関連付けます。
クライアントは実際の POCO エンティティを受け取り、逆シリアル化します。 これらのクラスはプロキシ オブジェクトの遅延読み込みおよび変更追跡機能は持ちません。 層にまたがったこれらのエンティティの変更を追跡するには、自己追跡エンティティを使用します。 自己追跡エンティティは、Entity Framework に依存せず、独自の変更追跡ロジックを持っている POCO エンティティです。 詳細については、「チュートリアル: 自己追跡エンティティのシリアル化 (Entity Framework)」を参照してください。
詳細については、「チュートリアル: WCF による POCO プロキシのシリアル化 (Entity Framework)」を参照してください。
プロキシ オブジェクトは、バイナリ シリアル化を使用したシリアル化と逆シリアル化ができます。 ただし、AppDomain 境界にまたがってオブジェクト グラフをシリアル化する場合は、プロキシ型の定義がターゲット環境に存在することを確認する必要があります。 型が存在しない場合、逆シリアル化は失敗します。 型が存在することを確認するには、CreateProxyTypes を使用します。
注 : |
---|
プロキシ型のオブジェクトが作成されても、プロキシの遅延読み込みや変更追跡機能は含まれません。 |
関連オブジェクトは、バイナリ シリアル化およびデータ コントラクト シリアル化を使用して、プライマリ オブジェクトと共にシリアル化されます。 遅延読み込みでは、アクセスされる各リレーションシップ ナビゲーション プロパティに対するクエリが実行されます。バイナリと WCF の両方のデータ コントラクト シリアライザーがすべてのリレーションシップ ナビゲーション プロパティにアクセスします。 これによって、シリアル化中に多くの予期しないクエリが実行される可能性があります。 プロキシ型の生成を無効にしない場合は (無効にすると遅延読み込みも無効になる)、次の例のように、明示的に遅延読み込みを無効にしてください。
' Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = False
// Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = false;
For more information, see オブジェクトのシリアル化 (Entity Framework).
プロキシ固有の API の概要
次の API は、POCO プロキシの使用に関連しています。
メンバー | Description |
---|---|
POCO クラスがこのトピックの「クラス定義の要件」で説明されている要件を満たしており、ProxyCreationEnabled が true に設定されている場合は、新しい POCO プロキシ オブジェクトを作成します。それ以外の場合には、ジェネリック引数型のオブジェクトを作成します。 このメソッドのジェネリック引数には、任意の具象参照型を指定できます (抽象クラス、インターフェイス、および値型はサポートされていません)。 ジェネリック型が、概念モデルにマッピングされていない CLR 型であるか、プロキシの作成要件を満たしていない型である場合、メソッドでは渡された型の、パラメーターなしのコンストラクターを使用して型の新しいインスタンスを作成し、返すことを試みます。 ObjectContext の CreateObject のほかに、ObjectSet の CreateObject メソッドと CreateObject メソッドも使用できます。 詳細については、「方法: プロキシを持つ POCO エンティティを作成する (Entity Framework)」を参照してください。 このメソッドでは、作成されたオブジェクトはオブジェクト コンテキストに追加されません。 オブジェクトをコンテキストに追加するには、「オブジェクトの作成、追加、変更、および削除 (Entity Framework)」で説明されているメソッドを使用する必要があります。 |
|
ProxyCreationEnabled |
このフラグが true に設定されていると、Entity Framework は POCO エンティティ用のプロキシの作成を試みます。 既定では、ProxyCreationEnabled フラグは true に設定されています。 |
System.Data.Objects.ObjectContext.GetObjectType(System.Type) は、プロキシ型が引数として渡された場合に、指定されているプロキシの派生元の POCO 型を返す静的なメソッドです。 プロキシ以外の型が渡された場合は、同じ型がこのメソッドによって返されます。 |
|
CreateProxyTypes |
ObjectContext に読み込まれるメタデータに従って、指定された POCO 型のプロキシ型のセットを作成します。 このメソッドでは、作成されたプロキシ型のオブジェクトはインスタンス化しません。 たとえば、次のコードは データ ソースからオブジェクトを読み込むか、CreateObject を使用して新しいオブジェクトを作成すると、Entity Framework では実行時に POCO クラスのプロキシ型を作成します。 ただし、プロキシ型を事前に作成する必要が生じるシナリオも存在します。 たとえば、AppDomain 境界にまたがってオブジェクト グラフをシリアル化する場合は、プロキシ型がターゲット環境に実際に存在することを確認する必要があります。 型が存在しない場合、逆シリアル化は失敗します。 詳細については、「How to: Serialize and Deserialize POCO with Proxies To and From Binary Stream」を参照してください。 |
GetKnownProxyTypes は、これまでに AppDomain で作成されているすべてのプロキシ型を含む列挙を返す静的なメソッドです。 シリアル化のシナリオでは、このメソッドは、ターゲット環境に既に含まれており、シリアライザーが認識する必要のある型をすべて取得するために使用できます。 詳細については、「How to: Serialize and Deserialize POCO with Proxies To and From Binary Stream」を参照してください。 |
このセクションの内容
POCO プロキシの作成要件 (Entity Framework)
関連 POCO エンティティの読み込み (Entity Framework)
POCO エンティティでの変更の追跡 (Entity Framework)
方法: POCO エンティティを定義する (Entity Framework)
方法: カスタム オブジェクト コンテキストを定義する (Entity Framework)
カスタム オブジェクトを操作できるようにモデリング ファイルとマッピング ファイルをカスタマイズする方法 (Entity Framework)
方法: カスタム オブジェクト コンテキストを定義する (Entity Framework)
方法: プロキシを持つ POCO エンティティを作成する (Entity Framework)
方法: POCO エンティティを明示的に読み込む (Entity Framework)
方法: POCO エンティティ間のリレーションシップを変更 (Entity Framework)
参照
概念
オブジェクトのカスタマイズ (Entity Framework)
リレーションシップの定義と管理 (Entity Framework)