次の方法で共有


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

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

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

EF デザイナー

前提条件

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 データベースのすべてのテーブルがモデルに追加されます。
  • [完了] をクリックします。

モデルを編集するためのデザイン 画面を提供するエンティティ デザイナーが表示されます。

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

この手順では、Person エンティティ型を更新して、Person テーブルと PersonInfo テーブルのデータを結合します。

  • **PersonInfo **エンティティの Email プロパティと Phone プロパティを選択し、 Ctrl キーを押しながら X キーを押します。

  • **Person **エンティティを選択し、 Ctrl + V キーを押します。

  • デザイン画面で PersonInfo エンティティを選択し、キーボードの Delete ボタンを押します。

  • モデルから PersonInfo テーブルを削除するかどうかを確認するメッセージが表示されたら、[いいえ] をクリックして、Person エンティティにマップします。

    テーブルの削除

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

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

Person エンティティ型が Person テーブルと PersonInfo テーブルにマップされるようになりました。

マッピング 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 ステートメントがデータベースに対して実行されました。 

  • コンテキストを実行した結果、次の 2 つの INSERT ステートメントが実行されました。SaveChanges(). Person エンティティからデータを取得し、 Person テーブルと PersonInfo テーブル間 分割します。

    挿入 1

    挿入 2

  • 次の SELECT は、データベース内のユーザーを列挙した結果として実行されました。 Person テーブルと PersonInfo テーブルのデータが結合されます。

    Person データと PersonInfo データを組み合わせて選択