次の方法で共有


デザイナーテーブル分割

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

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

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

EF デザイナー

前提条件

このチュートリアルを完了するには、次のものが必要です。

プロジェクトを設定する

このチュートリアルでは、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 キーを押します。
  • PersonHireInfo の間に関連付けを作成します。 これを行うには、デザイン サーフェイスの空の領域を右クリックし、[ 新規追加] をポイントして、[ 関連付け] をクリックします。
  • [ 関連付けの追加 ] ダイアログ ボックスが表示されます。 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 エンティティのデータを結合します

    Person と HireInfo のデータの結合を挿入

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

    1 を選択する

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

    2 を選択する