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

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

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

次の図は、EF デザイナーを操作するときに使用されるメインウィンドウを示しています。

EF デザイナー

前提条件

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

プロジェクトを設定する

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

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

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

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

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

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

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

注意

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

  • デザイン画面の空の領域を右クリックし、[ 新規追加] をポイントして、[ エンティティ] をクリックします。 [ 新しいエンティティ   ] ダイアログボックスが表示されます。
  • [エンティティ名] に「 Hireinfo」、   キープロパティ名に「 PersonID 」と入力します。 Entity name
  •  [OK] をクリックします。
  • 新しいエンティティ型が作成され、デザイン画面に表示されます。
  •  HireDate    Personエンティティ型の HireDate プロパティを選択   し、ctrl キーを押しながら Xキーを押します。
  • Hireinfo   エンティティを選択し、ctrl キーを押しながら Vキーを押します。
  • Personhireinfoの間の関連付けを作成します。 これを行うには、デザイン画面の空の領域を右クリックし、[ 新規追加] をポイントして、[ 関連付け] をクリックします。
  • アソシエーションの追加   ] ダイアログボックスが表示されます。 既定では、 個人情報 の名前が指定されています。
  • リレーションシップの両方の end で多重度 1 (1) を指定します。
  • [OK] をクリックします。

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

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

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

    マッピングのプロパティ

  • デザイン画面で、[ 個人情報 ] の関連付けを選択します。

  • デザイン画面でアソシエーションを右クリックし、[ プロパティ] を選択します。

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

  • [プリンシパル] ドロップダウンリストから [ 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 ステートメントが実行されました。 

  • 次の INSERT は、コンテキストの実行結果として実行されました。SaveChanges () と Person および hireinfo エンティティのデータを結合します。

    結合 Person と HireInfo データを挿入する

  • 次のSELECTは、コンテキストの実行結果として実行されました。FirstOrDefault () を選択し、 Personにマップされた列のみを選択します

    [1] を選択します

  • 次のSELECTは、ナビゲーションプロパティ existingperson にアクセスした結果として実行され、 hireinfoにマップされた列のみを選択しました。

    2を選択