デザイナーのエンティティ分割
このチュートリアルでは、Entity Framework Designer (EF Designer) を使ってモデルを変更して、エンティティ型を 2 つのテーブルにマップする方法について説明します。 エンティティを複数のテーブルにマップできるのは、それらのテーブルのキーが共通している場合です。 エンティティ型を 2 つのテーブルにマップする場合に適用される概念は、エンティティ型を 3 つ以上のテーブルにマップする場合にも簡単に応用できます。
次の図は、EF Designer での作業時に使用されるメイン ウィンドウを示しています。
前提条件
Visual Studio 2012 または Visual Studio 2010、Ultimate、Premium、Professional、または Web Express エディション。
データベースを作成する
Visual Studio と共にインストールされるデータベース サーバーは、インストールされている Visual Studio のバージョンによって異なります。
- Visual Studio 2012 を使っている場合は、LocalDB データベースを作成します。
- Visual Studio 2010 を使用している場合は、SQL Express データベースを作成します。
まず、1 つのエンティティに結合する 2 つのテーブルを含むデータベースを作成します。
- Visual Studio を開きます
- [表示] -> [サーバー エクスプローラー]
- [データ接続] を右クリックし、[接続の追加] を選択します。
- これまでサーバー エクスプローラーからデータベースに接続したことがない場合は、データ ソースとして Microsoft SQL Server を選択する必要があります。
- インストールされているものに応じて、LocalDB または SQL Express のいずれかに接続します。
- データベース名として「EntitySplitting」と入力します。
- [OK] を選択すると、新しいデータベースを作成するかどうかを確認するメッセージが表示されます。[はい] を選択します。
- サーバー エクスプローラーに新しいデータベースが表示されます。
- Visual Studio 2012 を使用している場合
- サーバー エクスプローラーでこのデータベースを右クリックし、[新しいクエリ] を選択します
- 次の SQL を新しいクエリにコピーし、クエリを右クリックして [実行] を選択します。
- Visual Studio 2010 を使用している場合
- [データ] -> [Transact-SQL エディター] -> [新しいクエリ接続] の順に選択します。
- サーバー名として「.\SQLEXPRESS」と入力し、[OK] をクリックします。
- クエリ エディターの上部にあるドロップダウンから [EntitySplitting] データベースを選択します。
- 次の SQL を新しいクエリにコピーし、クエリを右クリックして [SQL の実行] を選択します。
CREATE TABLE [dbo].[Person] (
[PersonId] INT IDENTITY (1, 1) NOT NULL,
[FirstName] NVARCHAR (200) NULL,
[LastName] NVARCHAR (200) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonId] ASC)
);
CREATE TABLE [dbo].[PersonInfo] (
[PersonId] INT NOT NULL,
[Email] NVARCHAR (200) NULL,
[Phone] NVARCHAR (50) NULL,
CONSTRAINT [PK_PersonInfo] PRIMARY KEY CLUSTERED ([PersonId] ASC),
CONSTRAINT [FK_Person_PersonInfo] FOREIGN KEY ([PersonId]) REFERENCES [dbo].[Person] ([PersonId]) ON DELETE CASCADE
);
プロジェクトの作成
- [ファイル] メニューの [新規作成] をポイントし、 [プロジェクト] をクリックします。
- 左ペインで [Visual C#] をクリックし、[コンソール アプリケーション] テンプレートを選択します。
- プロジェクトの名前として「MapEntityToTablesSample」と入力し、[OK] をクリックします。
- 最初のセクションで作成した SQL クエリを保存するかどうかを確認するメッセージが表示されたら、[いいえ] をクリックします。
データベースに基づいてモデルを作成する
- ソリューション エクスプローラーでプロジェクト名を右クリックし、[追加] をポイントして、[新しい項目] をクリックします。
- 左側のメニューから [データ] を選択し、[テンプレート] ペインの [ADO.NET Entity Data Model] を選択します。
- ファイル名として「MapEntityToTablesModel.edmx」と入力し、[追加] をクリックします。
- [モデルのコンテンツの選択] ダイアログ ボックスで、[データベースから生成] を選択し、[次へ] をクリックします。
- ドロップダウンから [EntitySplitting] 接続を選択し、[次へ] をクリックします。
- [データベース オブジェクトの選択] ダイアログ ボックスで、[テーブル] ノードの横のボックスをオンにします。 これにより、EntitySplitting データベースのすべてのテーブルがモデルに追加されます。
- [完了] をクリックします。
モデルを編集するためのデザイン サーフェイスを提供する Entity Designer が表示されます。
エンティティを 2 つのテーブルにマップする
この手順では、Person エンティティ型を更新して、Person テーブルと PersonInfo テーブルのデータを結合します。
**PersonInfo **エンティティの Email および Phone プロパティを選択し、Ctrl + X キーを押します。
**Person **エンティティを選択し、Ctrl + V キーを押します。
デザイン サーフェイスで、PersonInfo エンティティを選択し、キーボードの Delete キーを押します。
モデルから PersonInfo テーブルを削除するかどうかをたずねられたら、[いいえ] をクリックします。この後、これを Person エンティティにマップします。
以降の手順では、[マッピングの詳細] ウィンドウが必要です。 このウィンドウが表示されていない場合は、デザイン サーフェイスを右クリックし、[マッピングの詳細] を選択します。
- [マッピングの詳細] ウィンドウで、Person エンティティ型を選択し、[<テーブルまたはビューの追加>] をクリックします。
- ドロップダウン リストから **[PersonInfo] ** を選択します。 [マッピングの詳細] ウィンドウが既定の列マッピングで更新されますが、このシナリオでは問題ありません。
これで、Person エンティティ型が Person テーブルと PersonInfo テーブルにマップされました。
モデルを使用する
- Main メソッドに次のコードを貼り付けます。
using (var context = new EntitySplittingEntities())
{
var person = new Person
{
FirstName = "John",
LastName = "Doe",
Email = "john@example.com",
Phone = "555-555-5555"
};
context.People.Add(person);
context.SaveChanges();
foreach (var item in context.People)
{
Console.WriteLine(item.FirstName);
}
}
- アプリケーションをコンパイルして実行します。
このアプリケーションを実行した結果として、データベースに対して次の T-SQL ステートメントが実行されました。
context.SaveChanges() を実行した結果として、次の 2 つの INSERT ステートメントが実行されました。 これにより、Person エンティティからデータが取得され、Person テーブルと PersonInfo テーブルに分割されます。
データベース内の個人を列挙した結果として、次の SELECT が実行されました。 これにより、Person テーブルと PersonInfo テーブルのデータが結合されます。
.NET