次の方法で共有


チュートリアル : 複数のテーブルへのエンティティのマッピング

このトピックでは、Entity Data Model (EDM) で概念モデルを変更することによって 1 つのエンティティ型を 2 つのテーブルにマップする方法について説明します。エンティティを複数のテーブルにマップできるのは、それらのテーブルのキーが共通している場合です。エンティティ型を 2 つのテーブルにマップする場合に適用される概念は、エンティティ型を 3 つ以上のテーブルにマップする場合にも簡単に応用できます。複数のテーブルへのエンティティのマッピングの詳細については、「2 つのテーブルにマップされた単一のエンティティでモデルを定義する方法」を参照してください。

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

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

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

    [!メモ]

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

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

  4. Location プロパティを 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 アプリケーションで使用する EDM を変更します。その後、インストラクタのオフィスの割り当てを表示できるようにアプリケーションの機能を拡張します。

[!メモ]

このドキュメントのチュートリアルのトピックの多くは CourseManager アプリケーションを開始点としているため、元の CourseManager コードを編集するのではなく、このチュートリアル用に CourseManager アプリケーションのコピーを使用することをお勧めします。

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

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

この手順では、新しいエンティティ型 (Instructor) を作成して 2 つのテーブル (Person および OfficeAssignment) にマップすることによって SchoolModel EDM の概念モデルを変更します。

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. を繰り返します。

    [!メモ]

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

  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. viewOfficesButton をダブルクリックします。

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

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

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

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

EDM に対するクエリ

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

EDM に対してクエリを実行するには

  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.Person.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
    
    schoolContext = new SchoolEntities();
    
    // Get Persons of type Instructor.
    ObjectQuery<Instructor> instructorQuery = schoolContext
        .Person.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;
    
  5. OfficeAssignment フォームのデザイン ビューに戻り、saveChangesButton コントロールをダブルクリックします。

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

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

    Dim numChanges As Integer
    
    ' Save object changes to the database, display a message,
    ' and refresh the form.
    numChanges = schoolContext.SaveChanges()
    MessageBox.Show(numChanges.ToString() + _
                    " change(s) saved to the database.")
    Me.Refresh()
    
    int numChanges;
    // Save object changes to the database, display a message,
    // and refresh the form.
    numChanges = schoolContext.SaveChanges();
    MessageBox.Show(numChanges.ToString() +
        " 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.Person.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
    End Sub

    Private Sub saveChanges_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles saveChanges.Click
        Dim numChanges As Integer

        ' Save object changes to the database, display a message,
        ' and refresh the form.
        numChanges = schoolContext.SaveChanges()
        MessageBox.Show(numChanges.ToString() + _
                        " 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
                .Person.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;
        }

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

次の手順

ここでは、1 つのエンティティを複数のテーブルにマップしました。複数のテーブルにマップされたエンティティでモデルを作成する方法の詳細については、「2 つのテーブルにマップされた単一のエンティティでモデルを定義する方法」を参照してください。Entity Framework を使用するアプリケーションを構築する方法の詳細については、「プログラミング ガイド (Entity Framework)」を参照してください。

参照

その他のリソース

ADO.NET Entity Data Model デザイナのシナリオ
Entity Data Model ツールのタスク