このチュートリアルでは、Entity Framework Designer (EF Designer) を使用してモデルを変更して、エンティティ型を 2 つのテーブルにマップする方法について説明します。 テーブルが共通キーを共有している場合は、エンティティを複数のテーブルにマップできます。 エンティティ型を 2 つのテーブルにマッピングする場合に適用される概念は、エンティティ型を複数のテーブルにマッピングするように簡単に拡張できます。
次の図は、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 テーブルにマップされるようになりました。
モデルを使用する
- 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 テーブル間 で 分割します。
次の SELECT は、データベース内のユーザーを列挙した結果として実行されました。 Person テーブルと PersonInfo テーブルのデータが結合されます。
.NET