オブジェクトの平坦化 (EntityDataSource)
状況によっては、EntityDataSource コントロールでエンティティのラッパーが作成されます。 ここでは、ラッパーが作成されるシナリオについて説明し、ラッパーからエンティティ オブジェクトを取得する方法を示します。
EntitySetName プロパティを使用して EntityDataSource コントロールを初期化すると、EntityDataSource は結果の各エンティティ インスタンスを ICustomTypeDescriptor 型のオブジェクトにラップします。 このラッパー オブジェクトでは、複合型のオブジェクトおよび関係に参加するオブジェクトについて双方向のデータ バインディングを可能にする PropertyDescriptor が公開されます。 また、PropertyDescriptor で外部キー情報にアクセスできます。 その結果、たとえば GridView コントロールの RowDataBound イベントの引数から、元のエンティティ オブジェクトを取得しようとすると、エンティティ オブジェクトではなくラッパー オブジェクトが取得されます。
注意
CommandText を使用して特定のプロパティのエンティティ オブジェクトまたはプロジェクションを返すクエリを指定する場合、または Select を使用してプロジェクション クエリを作成する場合、エンティティ オブジェクトはラップされません。
次のコードは、ラッパー オブジェクトからエンティティ オブジェクトを取得する方法の例です。
protected void ProductsGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
var entity = dataItem as Product;
if (entity == null)
{
var td = dataItem as ICustomTypeDescriptor;
if (td != null)
{
entity = (Product)td.GetPropertyOwner(null);
}
}
}
.NET Framework Version 4 以降を使用している場合、モデルに外部キー プロパティを含めることができます。 多くの場合、こうすることでラッパー オブジェクトの必要性がなくなります。 ラッパーの作成を無効にするには、EnableFlattening プロパティを false に設定します。 既定では、EnableFlattening は true に設定されます。 概念モデルに外部キー プロパティが含まれ、複合型を含まない場合、EntityDataSource によってデザイン時に EnableFlattening は false に設定され、エンティティのラッパー オブジェクトの作成が回避されます。