デザイナーのエンティティ分割

このチュートリアルでは、Entity Framework Designer (EF Designer) を使ってモデルを変更して、エンティティ型を 2 つのテーブルにマップする方法について説明します。 エンティティを複数のテーブルにマップできるのは、それらのテーブルのキーが共通している場合です。 エンティティ型を 2 つのテーブルにマップする場合に適用される概念は、エンティティ型を 3 つ以上のテーブルにマップする場合にも簡単に応用できます。

次の図は、EF Designer での作業時に使用されるメイン ウィンドウを示しています。

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 エンティティにマップします。

    Delete Tables

以降の手順では、[マッピングの詳細] ウィンドウが必要です。 このウィンドウが表示されていない場合は、デザイン サーフェイスを右クリックし、[マッピングの詳細] を選択します。

  • [マッピングの詳細] ウィンドウで、Person エンティティ型を選択し、[<テーブルまたはビューの追加>] をクリックします。
  • ドロップダウン リストから **[PersonInfo] ** を選択します。 [マッピングの詳細] ウィンドウが既定の列マッピングで更新されますが、このシナリオでは問題ありません。

これで、Person エンティティ型が Person テーブルと PersonInfo テーブルにマップされました。

Mapping 2

モデルを使用する

  • 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 テーブルに分割されます。

    Insert 1

    Insert 2

  • データベース内の個人を列挙した結果として、次の SELECT が実行されました。 これにより、Person テーブルと PersonInfo テーブルのデータが結合されます。

    Select Combining Person and PersonInfo Data