列挙型のサポート - Code First

Note

EF5 以降のみ - このページで説明する機能、API などは、Entity Framework 5 で導入されました。 以前のバージョンを使用している場合、一部またはすべての情報は適用されません。

このビデオとステップバイステップのチュートリアルでは、Entity Framework Code First で列挙型を使用する方法について説明します。 また、LINQ クエリで列挙型を使用する方法も示します。

このチュートリアルでは、Code First を使用して新しいデータベースを作成しますが、Code First を使用して既存のデータベースにマップすることもできます。

列挙型のサポートは Entity Framework 5 で導入されました。 列挙型、空間データ型、テーブル値関数などの新機能を使用するには、.NET Framework 4.5 をターゲットにする必要があります。 既定では、Visual Studio 2012 は .NET 4.5 をターゲットにしています。

Entity Framework では、列挙型には、次の基になる型を指定できます: ByteInt16Int32Int64、または SByte

ビデオを見る

このビデオでは、Entity Framework Code First で列挙型を使用する方法を示します。 また、LINQ クエリで列挙型を使用する方法も示します。

発表者: Julia Kornich

ビデオ: WMV | MP4 | WMV (ZIP)

前提条件

このチュートリアルを完了するには、Visual Studio 2012、Ultimate、Premium、Professional、または Web Express エディションがインストールされている必要があります。

 

プロジェクトをセットアップする

  1. Visual Studio 2012 を開きます
  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします
  3. 左ペインで [Visual C#] をクリックし、[コンソール] テンプレートを選択します
  4. プロジェクトの名前として「EnumCodeFirst」と入力し、[OK] をクリックします

Code First を使用して新しいモデルを定義する

通常、Code First の開発を使用するときはまず、概念 (ドメイン) モデルを定義する .NET Framework のクラスを記述します。 次のコードでは、Department クラスを定義しています。

また、このコードでは DepartmentNames 列挙型も定義しています。 既定では、列挙型は int 型です。 Department クラスの Name プロパティは DepartmentNames 型です。

Program.cs ファイルを開き、次のクラス定義を貼り付けます。

public enum DepartmentNames
{
    English,
    Math,
    Economics
}     

public partial class Department
{
    public int DepartmentID { get; set; }
    public DepartmentNames Name { get; set; }
    public decimal Budget { get; set; }
}

 

DbContext の派生型を定義する

エンティティを定義するだけでなく、DbContext から派生して DbSet<TEntity> プロパティを公開するクラスを定義する必要があります。 DbSet<TEntity> プロパティにより、モデルに含める型をコンテキストに認識させることができます。

DbContext の派生型のインスタンスによって、実行時にエンティティ オブジェクトが管理されます。これには、オブジェクトへのデータベースのデータの設定、変更の追跡、データベースへのデータの保持が含まれます。

DbContext および DbSet 型は EntityFramework アセンブリで定義されています。 EntityFramework NuGet パッケージを使用して、この DLL への参照を追加します。

  1. ソリューション エクスプローラーで、プロジェクト名を右クリックします。
  2. [NuGet パッケージの管理] を選択します
  3. [NuGet パッケージの管理] ダイアログで [オンライン] タブを選択し、[EntityFramework] パッケージを選択します。
  4. [インストール]をクリックします。

EntityFramework アセンブリに加えて、System.ComponentModel.DataAnnotations および System.Data.Entity アセンブリへの参照も追加されることに注意してください。

Program.cs ファイルの先頭に、次の using ステートメントを追加します。

using System.Data.Entity;

Program.cs で、コンテキスト定義を追加します。 

public partial class EnumTestContext : DbContext
{
    public DbSet<Department> Departments { get; set; }
}

 

データの永続化と取得

Main メソッドが定義されている Program.cs ファイルを開きます。 Main 関数に次のコードを追加します。 このコードによって、新しい Department オブジェクトがコンテキストに追加されます。 その後、データが保存されます。 また、このコードによって、名前が DepartmentNames.English である Department を返す LINQ クエリも実行されます。

using (var context = new EnumTestContext())
{
    context.Departments.Add(new Department { Name = DepartmentNames.English });

    context.SaveChanges();

    var department = (from d in context.Departments
                        where d.Name == DepartmentNames.English
                        select d).FirstOrDefault();

    Console.WriteLine(
        "DepartmentID: {0} Name: {1}",
        department.DepartmentID,  
        department.Name);
}

アプリケーションをコンパイルして実行します。 このプログラムの出力は、次のようになります。

DepartmentID: 1 Name: English

 

生成されたデータを表示する

アプリケーションを初めて実行すると、Entity Framework によって自動的にデータベースが作成されます。 Visual Studio 2012 をインストールしているため、データベースは LocalDB インスタンス上に作成されます。 既定では、Entity Framework によって、派生コンテキストの完全修飾名に基づいてデータベースに名前が付けられます (この例では EnumCodeFirst.EnumTestContext となります)。 その後は、この既存のデータベースが使用されます。  

データベースの作成後にモデルに変更を加えた場合は、Code First Migrations を使用してデータベース スキーマを更新する必要があることに注意してください。 Migrations の使用例については、「新しいデータベースへの Code First」を参照してください。

データベースとデータを表示するには、次の手順を実行します。

  1. Visual Studio 2012 のメイン メニューで、[表示] ->[SQL Server オブジェクト エクスプローラー] を選択します。
  2. LocalDB がサーバーの一覧に表示されていない場合は、[SQL Server] でマウスの右ボタンをクリックし、[SQL Server の追加] を選択します 既定の Windows 認証を使用して、LocalDB インスタンスに接続します
  3. [LocalDB] ノードを展開します
  4. [データベース] フォルダーを展開して新しいデータベースを表示し、[Department] テーブルを参照します Code First では、列挙型にマップされるテーブルは作成されない点に注意してください
  5. データを表示するには、テーブルを右クリックし、[データの表示] を選択します

まとめ

このチュートリアルでは、Entity Framework Code First で列挙型を使用する方法について説明しました。