リフレクション プロバイダー (WCF Data Services)
Entity Framework を介してデータ モデルからデータを公開することに加えて、WCF Data Services では、エンティティ ベースのモデルで厳密に定義されていないデータを公開することもできます。 リフレクション プロバイダーは、IQueryable<T> インターフェイスを実装する型を返すクラスのデータを公開します。 WCF Data Services は、リフレクションを使用して、これらのクラスのデータ モデルを推論し、リソースに対するアドレス ベースのクエリを、公開されている IQueryable<T> 型に対する統合言語クエリ (LINQ) ベースのクエリに変換します。
注意
AsQueryable メソッドを使用して、IEnumerable<T> インターフェイスを実装する任意のクラスから IQueryable<T> インターフェイスを返すことができます。これによって、ほとんどのジェネリック コレクション型をデータ サービスのデータ ソースとして使用することが可能になります。
リフレクション プロバイダーは、型の階層をサポートします。 詳細については、「方法: リフレクション プロバイダーを使用してデータ サービスを作成する (WCF Data Services)」を参照してください。
データ モデルの推論
データ サービスを作成すると、プロバイダーはリフレクションを使用してデータ モデルを推論します。 リフレクション プロバイダーがデータ モデルを推論する方法を次の一覧に示します。
エンティティ コンテナー – IQueryable<T> インターフェイスを返すプロパティとしてデータを公開するクラス。 リフレクション ベースのデータ モデルを作成すると、エンティティ コンテナーはサービスのルートを表します。 1 つの名前空間でサポートされるエンティティ コンテナー クラスは 1 つだけです。
エンティティ セット - IQueryable<T> インスタンスを返すプロパティはエンティティ セットとして処理されます。 エンティティ セットは、クエリでリソースとして直接アドレス指定されます。 エンティティ コンテナーの 1 つのプロパティが返すことができるのは、1 つの型の IQueryable<T> インスタンスだけです。
エンティティ型 – エンティティ セットが返す IQueryable<T> の T 型。 継承階層の一部であるクラスは、リフレクション プロバイダーによって同等のエンティティ型階層に変換されます。
エンティティ キー – エンティティ型である各データ クラスには 1 つのキー プロパティが必要です。 このプロパティは、DataServiceKeyAttribute 属性 ([DataServiceKeyAttribute]) で属性化されています。
注意
DataServiceKeyAttribute 属性は、エンティティ型のインスタンスを一意に識別するために使用できるプロパティのみに適用してください。ナビゲーション プロパティに適用すると、この属性は無視されます。
エンティティ型プロパティ – リフレクション プロバイダーは、エンティティ キー以外で、次に示すエンティティ型のクラスのアクセス可能な非インデクサー プロパティを処理します。
プロパティがプリミティブ型を返す場合、プロパティはエンティティ型のプロパティと見なされます。
プロパティがエンティティ型でもある型を返す場合、プロパティは、多対一または一対一のリレーションシップの "一" の側を表すナビゲーション プロパティと見なされます。
プロパティがエンティティ型の IEnumerable<T> を返す場合、プロパティは、一対多または多対多のリレーションシップの "多" の側を表すナビゲーション プロパティと見なされます。
プロパティの戻り値の型が値型である場合、プロパティは複合型を表します。
注意
エンティティ リレーショナル モデルに基づくデータ モデルとは異なり、リフレクション プロバイダーに基づくモデルではリレーショナル データは理解されません。Entity Framework を使用して、WCF Data Services 経由でリレーショナル データを公開する必要があります。
データ型のマッピング
データ モデルが .NET Framework クラスから推論されると、次に示すようにデータ モデルのプリミティブ型が .NET Framework データ型にマップされます。
.NET Framework データ型 |
データ モデル型 |
---|---|
Byte[] |
Edm.Binary |
Edm.Boolean |
|
Edm.Byte |
|
Edm.DateTime |
|
Edm.Decimal |
|
Edm.Double |
|
Edm.Guid |
|
Edm.Int16 |
|
Edm.Int32 |
|
Edm.Int64 |
|
Edm.SByte |
|
Edm.Single |
|
Edm.String |
注意
.NET Framework の NULL 許容値型は、対応する値型で NULL を指定できないものと同じデータ モデル型にマップされます。
データ モデルでの更新の有効化
この種類のデータ モデルを介して公開されるデータを更新するために、リフレクション プロバイダーは、IUpdatable インターフェイスを定義します。 このインターフェイスは、公開されている型への更新を保存する方法をデータ サービスに指示します。 データ モデルによって定義されているリソースへの更新を有効にするには、エンティティ コンテナー クラスは、IUpdatable インターフェイスを実装する必要があります。 IUpdatable インターフェイスの実装例については、「方法: LINQ to SQL データ ソースを使用してデータ サービスを作成する (WCF Data Services)」を参照してください。
リフレクション プロバイダーを使用してデータ ソースに更新を伝達するには、IUpdatable インターフェイスに次のメンバーが実装されている必要があります。
メンバー |
説明 |
---|---|
ナビゲーション プロパティからアクセスされる関連オブジェクトのコレクションにオブジェクトを追加する機能を提供します。 |
|
データに対する保留中の変更を取り消す機能を提供します。 |
|
指定したコンテナーに新しいリソースを作成する機能を提供します。 |
|
リソースを削除する機能を提供します。 |
|
特定のクエリおよび型名によって識別されるリソースを取得する機能を提供します。 |
|
リソースのプロパティの値を返す機能を提供します。 |
|
ナビゲーション プロパティからアクセスされる関連オブジェクトのコレクションからオブジェクトを削除する機能を提供します。 |
|
指定したリソースを更新する機能を提供します。 |
|
特定のオブジェクト インスタンスによって表されるリソースを返す機能を提供します。 |
|
すべての保留中の変更を保存する機能を提供します。 |
|
ナビゲーション プロパティを使用して関連するオブジェクト参照を設定する機能を提供します。 |
|
リソースのプロパティの値を設定する機能を提供します。 |
同時実行の処理
WCF Data Services は、エンティティの同時実行トークンを定義できるようにすることで、オプティミスティック同時実行制御モデルをサポートしています。 この同時実行トークンは、エンティティの 1 つ以上のプロパティが含まれており、要求、更新、または削除されているデータに対して行われた変更があるかどうかを判断するためにデータ サービスによって使用されます。 要求内の eTag から取得したトークンの値がエンティティの現在の値と異なる場合、データ サービスで例外が発生します。 リフレクション プロバイダーの同時実行トークンを定義するために ETagAttribute がエンティティ型に適用されます。 同時実行トークンには、キー プロパティまたはナビゲーション プロパティを含めることはできません。 詳細については、「データ サービスの更新 (WCF Data Services)」を参照してください。
リフレクション プロバイダーによる SQL への LINQ の使用
既定では Entity Framework がネイティブでサポートされるので、これが WCF Data Services でリレーショナル データを使用する場合の推奨データ プロバイダーです。 ただし、データ サービスで LINQ to SQL クラスを使用するには、リフレクション プロバイダーを使用できます。 LINQ to SQL Object Relational Designer (O/R Designer) によって生成される DataContext のメソッドによって返される Table<TEntity> 結果セットは、IQueryable<T> インターフェイスを実装します。 そのため、リフレクション プロバイダーは、生成された LINQ to SQL クラスを使用して、これらのメソッドにアクセスし、SQL Server からエンティティ データを返すことができます。 ところが、LINQ to SQL は IUpdatable インターフェイスを実装しないので、既存の DataContext 部分クラスを拡張する部分クラスを追加して、IUpdatable 実装を追加する必要があります。 詳細については、「方法: LINQ to SQL データ ソースを使用してデータ サービスを作成する (WCF Data Services)」を参照してください。