チュートリアル: 複数のテーブルへのエンティティのマッピング (Entity Data Model ツール)

このトピックでは、概念モデルを変更することによって 1 つのエンティティ型を 2 つのテーブルにマップする方法について説明します。 エンティティを複数のテーブルにマップできるのは、それらのテーブルのキーが共通している場合です。 エンティティ型を 2 つのテーブルにマップする場合に適用される概念は、エンティティ型を 3 つ以上のテーブルにマップする場合にも簡単に応用できます。

このチュートリアルでは、CourseManager アプリケーションで使用する概念モデルを変更することによって、1 つのエンティティ型を 2 つのテーブルにマップします (詳細については、このトピックの「前提条件」を参照してください)。 新しいエンティティ型 (Person から派生する Instructor) を作成し、Person テーブルと OfficeAssignment テーブルにマップします。 以下の手順は、この処理の概要をまとめたものです (このドキュメントの後半では、これらの手順について詳しく説明します)。

  1. 新しいエンティティ型 Instructor を作成します。

  2. Instructor の基本データ型を Person に設定します。

    Cc716698.note(ja-jp,VS.100).gif注 :
    エンティティ型を複数のテーブルにマップするために継承階層を作成する必要はありません。この例では、より現実に即した例を示すために継承階層を使用しています (学校でオフィスが割り当てられるのはインストラクターだけです)。Instructor エンティティ型を作成しなくても、Person エンティティ型を Person テーブルと OfficeAssignment テーブルの両方にマップできます。

  3. HireDate プロパティを Person から Instructor に移動します。

  4. Location プロパティおよび Timestamp プロパティを OfficeAssignment から Instructor に移動します。

  5. HireDate Is Not Null という条件を設定して、Instructor エンティティを Person テーブルにマップします。 HireDate 列を HireDate プロパティにマップします。

  6. 条件を設定せずに、Instructor エンティティを OfficeAssignment テーブルにマップします。 InstructorID 列を PersonID プロパティに、Location 列を Location プロパティにマップします。

  7. OfficeAssignment エンティティ型を削除します。

前提条件

このチュートリアルを完了するには、最初に CourseManager アプリケーションを構築する必要があります。 詳細については、「Entity Framework クイック スタート」を参照してください。 新しいエンティティ型を追加して 2 つのテーブルにマップすることによって、CourseManager アプリケーションで使用する概念モデルを変更します。 その後、インストラクターのオフィスの割り当てを表示できるようにアプリケーションの機能を拡張します。

Cc716698.note(ja-jp,VS.100).gif注 :
このドキュメントのチュートリアルのトピックの多くは CourseManager アプリケーションを開始点としているため、元の CourseManager コードを編集するのではなく、このチュートリアル用に CourseManager アプリケーションのコピーを使用することをお勧めします。

このチュートリアルでは、Visual Studio、.NET Framework、および Visual C# または Visual Basic のプログラミングの基本的なスキルがある読者を想定しています。

2 つのテーブルへのエンティティのマッピング

この手順では、新しいエンティティ型 (Instructor) を作成して 2 つのテーブル (Person および OfficeAssignment) にマップすることによって School.edmx ファイルの CSDL およびマッピングの内容を変更します。

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

  1. Visual Studio で CourseManager ソリューションを開きます。

  2. ソリューション エクスプローラーで、School.edmx ファイルをダブルクリックします。

    Entity Data Model デザイナー (エンティティ デザイナー) で School.edmx ファイルが開きます。

  3. エンティティ デザイナーのデザイン画面の空の領域を右クリックし、[追加] をポイントして [エンティティ] をクリックします。

    [新しいエンティティ] ダイアログ ボックスが表示されます。

  4. [エンティティ名] に「Instructor」と入力し、[基本データ型] ボックスの一覧から [Person] を選択します。

  5. [OK] をクリックします。

    新しいエンティティ型が作成され、デザイン画面に表示されます。

  6. Person エンティティ型の HireDate プロパティ ([スカラー プロパティ] の下) を右クリックし、[切り取り] をクリックします。

  7. Instructor エンティティ型の [スカラー プロパティ] を右クリックし、[貼り付け] をクリックします。

  8. HireDate プロパティを右クリックし、[プロパティ] をクリックします。

    [プロパティ] ウィンドウが表示されます。

  9. [プロパティ] ウィンドウで、[Null 許容] プロパティを false に設定します。

  10. OfficeAssignment エンティティ型の Location プロパティを右クリックし、[切り取り] をクリックします。

  11. Instructor エンティティ型の [スカラー プロパティ] を右クリックし、[貼り付け] をクリックします。

  12. Location プロパティを右クリックし、[プロパティ] をクリックします。

  13. [プロパティ] ウィンドウで、[Null 許容] プロパティを false に設定します。

  14. OfficeAssignment 型の Timestamp プロパティについて、手順 10. ~ 13. を繰り返します。

    Cc716698.note(ja-jp,VS.100).gif注 :
    次の手順では、[マッピングの詳細] ウィンドウを使用します。このウィンドウが表示されていない場合は、デザイン画面を右クリックして [マッピングの詳細] をクリックします。

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

    [<テーブルまたはビューの追加>] フィールドは、選択したエンティティをマップできるテーブルまたはビューを示すドロップダウン リストになります。

  16. ドロップダウン リストから [Person] を選択します。

    [マッピングの詳細] ウィンドウが更新され、既定の列マッピング、および条件を追加するオプションが表示されます。

  17. <[条件の追加]> をクリックします。

    [<条件の追加>] フィールドは、条件を設定できる列を示すドロップダウン リストになります。

  18. ドロップダウン リストから [HireDate] を選択します。

  19. [マッピングの詳細] ウィンドウの [演算子] 列で、ドロップダウン リストから [Is] を選択します。

  20. [マッピングの詳細] ウィンドウの [プロパティ/値] 列で、[NULL 以外] を選択します。

  21. [<テーブルまたはニューの追加>] をクリックし、ドロップダウン リストから [OfficeAssignment] を選択します。

    [マッピングの詳細] ウィンドウが更新され、既定の列マッピングが表示されます。

  22. InstructorID 列に対応する [プロパティ/値] フィールドをクリックし、ドロップダウン リストから [PersonID] を選択します。

  23. OfficeAssignment エンティティ型を右クリックして [削除] をクリックします。

これで、Instructor エンティティ型が Person テーブルと OfficeAssignment テーブルにマップされました。

ユーザー インターフェイスの構築

次に、CourseAssignmentForm フォームを読み込んで表示するボタンを CourseViewer フォームに追加します。 さらに、Instructor のオフィスの場所を表示する DataGridView コントロールをフォームに追加します。 最後に、更新内容をデータベースに保存するボタンを CourseAssignmentForm に追加します。

ユーザー インターフェイスを構築するには

  1. ソリューション エクスプローラーで [CourseManager] プロジェクトを右クリックし、[追加] をポイントして [新しい項目] をクリックします。

    [新しい項目の追加] ダイアログ ボックスが表示されます。

  2. [Windows フォーム] を選択し、フォーム名を OfficeAssignment.vb または OfficeAssignment.cs に設定して、[追加] をクリックします。

    新しいフォームがプロジェクトに追加され、フォーム デザイナーで開かれます。 フォーム名が OfficeAssignment に、テキストが OfficeAssignment に設定されます。

  3. DataGridView コントロールをフォームにドラッグし、名前を officeGridView に設定します。

  4. DataGridView のスマート タグをクリックし、[追加を有効にする] オプションと [削除を有効にする] オプションをオフにします。

  5. Button コントロールをフォームにドラッグし、名前のプロパティを saveChanges に、テキストのプロパティを Update に設定します。

  6. ソリューション エクスプローラーで、CourseViewer.cs または CourseViewer.vb をダブルクリックします。

    CourseViewer フォームのデザイン ビューが表示されます。

  7. Button コントロールをツールボックスから CourseViewer フォームにドラッグします。

  8. [プロパティ] ウィンドウで、ボタンの名前を viewOffices に設定し、ボタンのテキストを View Offices に設定します。

  9. viewOffices Button をダブルクリックします。

    CourseViewer の分離コード ファイルが開きます。

  10. viewOffices_click イベント ハンドラーに次のコードを追加します。

    Dim officeForm As New OfficeAssignment()
    officeForm.Visible = True
    
    OfficeAssignment officeForm = new OfficeAssignment();
    officeForm.Visible = true;
    

このフォームのユーザー インターフェイスが完成しました。

概念モデルに対するクエリ

このアプリケーションでは、DataGridView コントロールをクエリにバインドすることによってデータを表示します。 DataGridView コントロールに表示される情報は編集が可能で、変更内容はデータベースに保存できます。 オブジェクトをコントロールにバインドする方法の詳細については、「Binding Objects to Controls (Entity Framework)」を参照してください。

概念モデルに対してクエリを実行するには

  1. フォーム デザイナーで OfficeAssignment フォームが開いた状態で、フォームの本文をダブルクリックします。

    OfficeAssignment フォームの分離コード ファイルが開きます。

  2. 次の using (C#) ステートメントまたは Imports (Visual Basic) ステートメントを追加して、School データベースから作成されたモデルとエンティティの名前空間を参照します。

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  3. データ コンテキストを表すプロパティを OfficeAssignment クラスに追加します。

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  4. OfficeAssignment_Load イベント ハンドラーで、オブジェクト コンテキストを初期化して、Instructor 情報を返すクエリに DataGridView コントロールをバインドするコードを追加します。

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Get Persons of type Instructor.
    Dim instructorQuery As ObjectQuery(Of Instructor) = _
        schoolContext.People.OfType(Of Instructor)()
    
    ' Bind the query results to the GridView control.
    ' Display only location and name.
    officeGridView.DataSource = instructorQuery _
        .Execute(MergeOption.OverwriteChanges)
    officeGridView.Columns("HireDate").Visible = False
    officeGridView.Columns("PersonID").Visible = False
    officeGridView.Columns("Timestamp").Visible = False
    officeGridView.Columns("EnrollmentDate").Visible = False
    officeGridView.Columns("StudentGrades").Visible = False
    officeGridView.Columns("Courses").Visible = False
    
    schoolContext = new SchoolEntities();
    
    // Get Persons of type Instructor.
    ObjectQuery<Instructor> instructorQuery = schoolContext
        .People.OfType<Instructor>();
    
    // Bind the query results to the GridView control.
    // Display only location and name.
    officeGridView.DataSource = instructorQuery
        .Execute(MergeOption.OverwriteChanges);
    officeGridView.Columns["HireDate"].Visible = false;
    officeGridView.Columns["Timestamp"].Visible = false;
    officeGridView.Columns["PersonID"].Visible = false;
    officeGridView.Columns["EnrollmentDate"].Visible = false;
    officeGridView.Columns["StudentGrades"].Visible = false;
    officeGridView.Columns["Courses"].Visible = false;
    
  5. OfficeAssignment フォームのデザイン ビューに戻り、saveChanges Button コントロールをダブルクリックします。

    saveChanges_Click イベント ハンドラーが分離コード ファイルで作成されます。

  6. イベント ハンドラーに、DataGridView コントロールで行った変更をデータベースに保存するコードを追加します。

    ' Save object changes to the database, 
    ' display a message, and refresh the form.
    schoolContext.SaveChanges()
    MessageBox.Show("Change(s) saved to the database.")
    Me.Refresh()
    
    // Save object changes to the database, 
    // display a message, and refresh the form.
    schoolContext.SaveChanges();
    MessageBox.Show("Change(s) saved to the database.");
    this.Refresh();
    

アプリケーションが完成しました。 Ctrl キーを押しながら F5 キーを押してアプリケーションを実行します。 [View Offices] ボタンをクリックして、OfficeAssignments フォームを読み込みます。 インストラクターの名前とオフィスの場所が表示されます。 表示された情報は編集が可能で、[Update] ボタンをクリックすると変更内容をデータベースに保存できます。

コード リスト

このセクションでは、OfficeAssignmentForm フォームの分離コード ファイルの最終バージョンを示します。

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class OfficeAssignment
    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

    Private Sub OfficeAssignment_Load(ByVal sender As System.Object, _
                                      ByVal e As System.EventArgs) _
                                      Handles MyBase.Load
        ' Initialize the ObjectContext.
        schoolContext = New SchoolEntities()

        ' Get Persons of type Instructor.
        Dim instructorQuery As ObjectQuery(Of Instructor) = _
            schoolContext.People.OfType(Of Instructor)()

        ' Bind the query results to the GridView control.
        ' Display only location and name.
        officeGridView.DataSource = instructorQuery _
            .Execute(MergeOption.OverwriteChanges)
        officeGridView.Columns("HireDate").Visible = False
        officeGridView.Columns("PersonID").Visible = False
        officeGridView.Columns("Timestamp").Visible = False
        officeGridView.Columns("EnrollmentDate").Visible = False
        officeGridView.Columns("StudentGrades").Visible = False
        officeGridView.Columns("Courses").Visible = False
    End Sub

    Private Sub saveChanges_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles saveChanges.Click
        ' Save object changes to the database, 
        ' display a message, and refresh the form.
        schoolContext.SaveChanges()
        MessageBox.Show("Change(s) saved to the database.")
        Me.Refresh()
    End Sub
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace CourseManager
{
    public partial class OfficeAssignment : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public OfficeAssignment()
        {
            InitializeComponent();
        }

        private void OfficeAssignment_Load(object sender, EventArgs e)
        {
            schoolContext = new SchoolEntities();

            // Get Persons of type Instructor.
            ObjectQuery<Instructor> instructorQuery = schoolContext
                .People.OfType<Instructor>();

            // Bind the query results to the GridView control.
            // Display only location and name.
            officeGridView.DataSource = instructorQuery
                .Execute(MergeOption.OverwriteChanges);
            officeGridView.Columns["HireDate"].Visible = false;
            officeGridView.Columns["Timestamp"].Visible = false;
            officeGridView.Columns["PersonID"].Visible = false;
            officeGridView.Columns["EnrollmentDate"].Visible = false;
            officeGridView.Columns["StudentGrades"].Visible = false;
            officeGridView.Columns["Courses"].Visible = false;
        }

        private void saveChanges_Click(object sender, EventArgs e)
        {
            // Save object changes to the database, 
            // display a message, and refresh the form.
            schoolContext.SaveChanges();
            MessageBox.Show("Change(s) saved to the database.");
            this.Refresh();
        }
    }
}

次の手順

ここでは、1 つのエンティティを複数のテーブルにマップしました。 複数のテーブルにマップされたエンティティでモデルを作成する方法の詳細については、「How to: Define a Model with a Single Entity Mapped to Two Tables」を参照してください。 Entity Framework を使用するアプリケーションを構築する方法の詳細については、「ADO.NET Entity Framework」を参照してください。

参照

その他のリソース

Entity Data Model ツールのシナリオ
Entity Data Model ツールのタスク