このチュートリアルでは、Entity Framework Designer (EF Designer) を使用してモデルを変更することで、複数のエンティティ型を 1 つのテーブルにマップする方法について説明します。
テーブル分割を使用する理由の 1 つは、遅延読み込みを使用してオブジェクトを読み込むときに、一部のプロパティの読み込みを遅らせることです。 非常に大量のデータを含む可能性があるプロパティを個別のエンティティに分割し、必要な場合にのみ読み込むことができます。
次の図は、EF デザイナーを使用するときに使用されるメイン ウィンドウを示しています。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Visual Studio の最新バージョン。
- 「School」サンプル データベース。
プロジェクトを設定する
このチュートリアルでは、Visual Studio 2012 を使用します。
- Visual Studio 2012 を開きます。
- [ファイル] メニューの [新規作成] をポイントし、 [プロジェクト] をクリックします。
- 左側のウィンドウで、Visual C# をクリックし、コンソール アプリケーション テンプレートを選択します。
- プロジェクトの名前として 「TableSplittingSample 」と入力し、[ OK] をクリックします。
School データベースに基づいてモデルを作成する
- ソリューション エクスプローラーでプロジェクト名を右クリックし、[ 追加] をポイントして、[ 新しい項目] をクリックします。
- 左側のメニューから [データ ] を選択し、[テンプレート] ウィンドウ ADO.NET エンティティ データ モデル を選択します。
- ファイル名として 「TableSplittingModel.edmx 」と入力し、[ 追加] をクリックします。
- [モデル コンテンツの選択] ダイアログ ボックスで、[データベースから生成] を選択し、[次へ] をクリックします。
- [新しい接続] をクリックします。 [接続のプロパティ] ダイアログ ボックスで、サーバー名 (例: (localdb)\mssqllocaldb) を入力し、認証方法を選択し、「 School 」と入力してデータベース名を入力し、[ OK] をクリックします。 [データ接続の選択] ダイアログ ボックスが、データベース接続設定で更新されます。
- [データベース オブジェクトの選択] ダイアログ ボックスで、[ テーブル ] ノードを展開し、[ Person ] テーブルをオンにします。 これにより、指定したテーブルが School モデルに追加されます。
- [完了] をクリックします。
モデルを編集するためのデザイン 画面を提供するエンティティ デザイナーが表示されます。 [データベース オブジェクトの選択] ダイアログ ボックスで選択したすべての オブジェクト がモデルに追加されます。
2 つのエンティティを 1 つのテーブルにマップする
このセクションでは、 Person エンティティを 2 つのエンティティに分割し、それらを 1 つのテーブルにマップします。
注
Person エンティティには、大量のデータを含む可能性のあるプロパティは含まれません。これは単に例として使用されます。
- デザイン サーフェイスの空の領域を右クリックし、[ 新規追加] をポイントして、[ エンティティ] をクリックします。 [ 新しいエンティティ] ダイアログ ボックスが表示されます。
- エンティティ名には HireInfo、キー プロパティ名には PersonID を入力します。
- OK をクリックします。
- 新しいエンティティ型が作成され、デザイン 画面に表示されます。
- Person エンティティ型の HireDate プロパティを選択し、Ctrl + X キーを押します。
- HireInfo エンティティを選択し、Ctrl + V キーを押します。
- Person と HireInfo の間に関連付けを作成します。 これを行うには、デザイン サーフェイスの空の領域を右クリックし、[ 新規追加] をポイントして、[ 関連付け] をクリックします。
- [ 関連付けの追加 ] ダイアログ ボックスが表示されます。 PersonHireInfo 名は既定で指定されます。
- リレーションシップの両端に多重度 1 (One) を指定します。
- OK をクリックします。
次の手順では 、[マッピングの詳細] ウィンドウが必要です。 このウィンドウが表示されない場合は、デザイン 画面を右クリックし、[ マッピングの詳細] を選択します。
HireInfo エンティティの種類を選択し、[<] ウィンドウで>テーブルまたはビューの追加をクリックします。
[ テーブルまたはビューの追加 ] フィールドのドロップダウン リストから [ 人物 ] を選択します。 リストには、選択したエンティティをマップできるテーブルまたはビューが含まれています。 既定では、適切なプロパティをマップする必要があります。
デザイン 画面で PersonHireInfo の関連付けを選択します。
デザイン 画面で関連付けを右クリックし、[ プロパティ] を選択します。
[ プロパティ ] ウィンドウで、[ 参照制約 ] プロパティを選択し、[省略記号] ボタンをクリックします。
[Person] ドロップダウンリストから [Principal] を選択します。
OK をクリックします。
モデルを使用する
- Main メソッドに次のコードを貼り付けます。
using (var context = new SchoolEntities())
{
Person person = new Person()
{
FirstName = "Kimberly",
LastName = "Morgan",
Discriminator = "Instructor",
};
person.HireInfo = new HireInfo()
{
HireDate = DateTime.Now
};
// Add the new person to the context.
context.People.Add(person);
// Insert a row into the Person table.
context.SaveChanges();
// Execute a query against the Person table.
// The query returns columns that map to the Person entity.
var existingPerson = context.People.FirstOrDefault();
// Execute a query against the Person table.
// The query returns columns that map to the Instructor entity.
var hireInfo = existingPerson.HireInfo;
Console.WriteLine("{0} was hired on {1}",
existingPerson.LastName, hireInfo.HireDate);
}
- アプリケーションをコンパイルして実行します。
このアプリケーションを実行した結果、 School データベースに対して次の T-SQL ステートメントが実行されました。
次の INSERT は、コンテキストの実行の結果として実行されました。SaveChanges() と Person エンティティと HireInfo エンティティのデータを結合します
次の SELECT は、コンテキストの実行の結果として実行されました。People.FirstOrDefault() と Person にマップされている列のみを選択します
次の SELECT は、ナビゲーション プロパティ existingPerson.Instructor にアクセスした結果として実行され、HireInfo にマップされた列のみを選択します。
.NET