デザイナーのテーブル分割

このチュートリアルでは、Entity Framework Designer (EF Designer) でモデルを変更して、複数のエンティティ型を 1 つのテーブルにマップする方法について説明します。

テーブル分割を使用する理由の 1 つは、遅延読み込みを使用してオブジェクトを読み込むときに、一部のプロパティの読み込みを遅延させることです。 大量のデータを含む可能性のあるプロパティを別のエンティティに分離し、必要な場合にのみそれを読み込むことができます。

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

EF Designer

前提条件

このチュートリアルを完了するための要件を次に示します。

プロジェクトをセットアップする

このチュートリアルでは、Visual Studio 2012 を使用します。

  • Visual Studio 2012 を開きます。
  • [ファイル] メニューの [新規作成] をポイントし、 [プロジェクト] をクリックします。
  • 左ペインで [Visual C#] をクリックし、[コンソール アプリケーション] テンプレートを選択します。
  • プロジェクトの名前として「TableSplittingSample」と入力し、[OK] をクリックします。

School データベースに基づいてモデルを作成する

  • ソリューション エクスプローラーでプロジェクト名を右クリックし、[追加] をポイントして、[新しい項目] をクリックします。
  • 左側のメニューから [データ] を選択し、[テンプレート] ペインの [ADO.NET Entity Data Model] を選択します。
  • ファイル名として「TableSplittingModel.edmx」と入力し、[追加] をクリックします。
  • [モデルのコンテンツの選択] ダイアログ ボックスで、[データベースから生成] を選択し、[次へ] をクリックします。
  • [新しい接続] をクリックします。 [接続のプロパティ] ダイアログ ボックスで、サーバー名 (例: (localdb)\mssqllocaldb) を入力し、認証方法を選択します。データベース名として「School」と入力し、[OK] をクリックします。 指定したデータベース接続設定に従って、[データ接続の選択] ダイアログ ボックスが更新されます。
  • [データベース オブジェクトの選択] ダイアログ ボックスで、[テーブル] ノードを展開し、Person テーブルをオンにします。 これにより、指定したテーブルが School モデルに追加されます。
  • [完了] をクリックします。

モデルを編集するためのデザイン サーフェイスを提供する Entity Designer が表示されます。 [データベース オブジェクトの選択] ダイアログ ボックスで選択したすべてのオブジェクトがモデルに追加されます。

2 つのエンティティを 1 つのテーブルにマップする

このセクションでは、Person エンティティを 2 つのエンティティに分割し、それらを 1 つのテーブルにマップします。

Note

Person エンティティには、大量のデータを含む可能性のあるプロパティは含まれていません。これは単に例として使用されています。

  • デザイン サーフェイスの空の領域を右クリックし、[新規追加] をポイントして、[エンティティ] をクリックします。 [新しいエンティティ] ダイアログ ボックスが表示されます。
  • [エンティティ名] に「HireInfo」、[キー プロパティ] の名前に「PersonID」と入力します。
  • [OK] をクリックします。
  • 新しいエンティティ型が作成され、デザイン画面に表示されます。
  • Person エンティティ型の HireDate プロパティを選択し、Ctrl + X キーを押します。
  • HireInfo エンティティを選択し、Ctrl + V キーを押します。
  • PersonHireInfo の間に関連付けを作成します。 これを行うには、デザイン サーフェイスの空の領域を右クリックし、[新規追加] をポイントして、[関連付け] をクリックします。
  • [関連付けの追加] ダイアログ ボックスが表示されます。 PersonHireInfo という名前が既定で指定されます。
  • リレーションシップの両端で、複数要素の接続性として [1 (One)] を指定します。
  • OK をクリックします。

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

  • [マッピングの詳細] ウィンドウで、HireInfo エンティティ型を選択し、[<テーブルまたはビューの追加>] をクリックします。

  • [<テーブルまたはビューの追加>] フィールドのドロップダウン リストから [Person] を選択します。 この一覧には、選択したエンティティをマップできるテーブルまたはビューが含まれています。 適切なプロパティが既定でマップされます。

    Mapping Properties

  • デザイン サーフェイスで PersonHireInfo 関連付けを選択します。

  • デザイン サーフェイスで関連付けを右クリックし、[プロパティ] を選択します。

  • [プロパティ] ウィンドウで、[参照に関する制約] プロパティを選択し、省略記号ボタンをクリックします。

  • [プリンシパル] ドロップダウン リストから [Person] を選択します。

  • 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 ステートメントが実行されました。 

  • context.SaveChanges() を実行した結果として、次の INSERT が実行され、Person エンティティと HireInfo エンティティのデータが結合されています。

    Insert Combining Person and HireInfo Data

  • context.People.FirstOrDefault() を実行した結果として、次の SELECT が実行され、Person にマップされた列だけが選択されています。

    Select 1

  • ナビゲーション プロパティ existingPerson.Instructor にアクセスした結果として、次の SELECT が実行され、HireInfo にマップされた列だけが選択されています。

    Select 2