Database First

このビデオとステップバイステップのチュートリアルでは、Entity Framework を使用した Database First 開発の概要を説明します。 Database First を使用すると、既存のデータベースからモデルをリバース エンジニアリングすることができます。 モデルは EDMX ファイル (.edmx 拡張子) に保存され、Entity Framework Designer で表示および編集できます。 アプリケーションで操作するクラスは、EDMX ファイルから自動的に生成されます。

ビデオを見る

このビデオでは、Entity Framework を使用した Database First 開発の概要を説明します。 Database First を使用すると、既存のデータベースからモデルをリバース エンジニアリングすることができます。 モデルは EDMX ファイル (.edmx 拡張子) に保存され、Entity Framework Designer で表示および編集できます。 アプリケーションで操作するクラスは、EDMX ファイルから自動的に生成されます。

提供: Rowan Miller

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

前提条件

このチュートリアルを実行するには、少なくとも Visual Studio 2010 または Visual Studio 2012 がインストールされている必要があります。

Visual Studio 2010 を使用している場合は、NuGet もインストールされている必要があります。

 

1. 既存のデータベースを作成する

通常、既存のデータベースを対象とする場合、データベースは既に作成されていますが、このチュートリアルでは、アクセスするデータベースを作成する必要があります。

Visual Studio と共にインストールされるデータベース サーバーは、インストールされている Visual Studio のバージョンによって異なります。

  • Visual Studio 2010 を使用している場合は、SQL Express データベースを作成します。
  • Visual Studio 2012 を使っている場合は、LocalDB データベースを作成します。

 

それではデータベースを生成しましょう。

  • Visual Studio を開きます

  • [表示] -> [サーバー エクスプローラー]

  • [データ接続] を右クリックし、[接続の追加] を選択します。

  • これまでサーバー エクスプローラーからデータベースに接続したことがない場合は、データ ソースとして Microsoft SQL Server を選択する必要があります。

    Select Data Source

  • インストールされているものに応じて、LocalDB または SQL Express のいずれかに接続し、データベース名として「DatabaseFirst.Blogging」と入力します。

    Sql Express Connection DF

    LocalDB Connection DF

  • [OK] を選択すると、新しいデータベースを作成するかどうかを確認するメッセージが表示されます。[はい] を選択します。

    Create Database Dialog

  • サーバー エクスプローラーに新しいデータベースが表示されたら、それを右クリックし、[新しいクエリ] を選択します。

  • 次の SQL を新しいクエリにコピーし、クエリを右クリックして [実行] を選択します。

CREATE TABLE [dbo].[Blogs] (
    [BlogId] INT IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (200) NULL,
    [Url]  NVARCHAR (200) NULL,
    CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
);

CREATE TABLE [dbo].[Posts] (
    [PostId] INT IDENTITY (1, 1) NOT NULL,
    [Title] NVARCHAR (200) NULL,
    [Content] NTEXT NULL,
    [BlogId] INT NOT NULL,
    CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
    CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
);

2. アプリケーションを作成する

わかりやすくするために、Database First を使用してデータ アクセスを実行する基本的なコンソール アプリケーションを構築します。

  • Visual Studio を開きます
  • [ファイル] -> [新規作成] -> [プロジェクト]
  • 左側のメニューから [Windows] を選択し、[コンソール アプリケーション] を選択します。
  • 名前として「DatabaseFirstSample」と入力します。
  • [OK] を選択します。

 

3. モデルをリバース エンジニアリングする

Visual Studio の一部として含まれている Entity Framework Designer を使用してモデルを作成します。

  • [プロジェクト] -> [新しい項目の追加...] を選択します。

  • 左側のメニューから [データ] を選び、[ADO.NET Entity Data Model] を選びます

  • 名前として「BloggingModel」と入力し、[OK] をクリックします。

  • これにより、Entity Data Model ウィザードが起動します。

  • [データベースから生成] を選択し、[次へ] をクリックします。

    Wizard Step 1

  • 最初のセクションで作成したデータベースへの接続を選択し、接続文字列の名前として「BloggingContext」と入力して、[次へ] をクリックします。

    Wizard Step 2

  • [テーブル] の横のチェック ボックスをオンにして、すべてのテーブルをインポートし、[完了] をクリックします

    Wizard Step 3

 

リバース エンジニアリング プロセスが完了すると、新しいモデルがプロジェクトに追加され、Entity Framework Designer で表示できるように開かれます。 データベースの接続の詳細と共に、App.config ファイルもプロジェクトに追加されています。

Model Initial

Visual Studio 2010 での追加の手順

Visual Studio 2010 で作業している場合は、最新バージョンの Entity Framework にアップグレードするために従う必要がある追加の手順がいくつかあります。 アップグレードが重要なのは、改善されてはるかに使いやすくなり、最新のバグ修正も適用された API サーフェイスにアクセスできるためです。

まず、NuGet から最新バージョンの Entity Framework を取得する必要があります。

  • [プロジェクト] -> [NuGet パッケージの管理] の順に移動します。"[NuGet パッケージの管理] オプションが表示されない場合は、最新バージョンの NuGet をインストールする必要があります。"
  • [オンライン] タブを選択します
  • EntityFramework パッケージを選択します。
  • [インストール]をクリックします。

次に、モデルを入れ替えて、新しいバージョンの Entity Framework で導入された DbContext API を使用するコードを生成する必要があります。

  • EF Designer でモデルの空いている場所を右クリックし、[コード生成項目の追加] を選択します。

  • 左側のメニューから [オンライン テンプレート] を選び、DbContext を検索します。

  • [C# 用 EF 5.x DbContext ジェネレーター] を選択し、名前として「BloggingModel」と入力して、[追加] をクリックします

    DbContext Template

 

4.データの読み取りと書き込み

モデルを用意できたので、それを使用してデータにアクセスしてみましょう。 データへのアクセスに使用するクラスは、EDMX ファイルに基づいて自動的に生成されます。

"このスクリーンショットは、Visual Studio 2012 のものです。Visual Studio 2010 を使用している場合、BloggingModel.tt ファイルと BloggingModel.Context.tt ファイルは、EDMX ファイルの下に入れ子になっているのではなく、プロジェクトの直下にあります。"

Generated Classes DF

 

次に示すように、Program.cs に Main メソッドを実装します。 このコードでは、コンテキストの新しいインスタンスを作成し、それを使用して新しい Blog を挿入します。 次に、LINQ クエリを使用して、データベースから、Title のアルファベット順に並べ替えられたすべての Blog を取得します。

class Program
{
    static void Main(string[] args)
    {
        using (var db = new BloggingContext())
        {
            // Create and save a new Blog
            Console.Write("Enter a name for a new Blog: ");
            var name = Console.ReadLine();

            var blog = new Blog { Name = name };
            db.Blogs.Add(blog);
            db.SaveChanges();

            // Display all Blogs from the database
            var query = from b in db.Blogs
                        orderby b.Name
                        select b;

            Console.WriteLine("All blogs in the database:");
            foreach (var item in query)
            {
                Console.WriteLine(item.Name);
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

これで、アプリケーションを実行してテストできるようになりました。

Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
ADO.NET Blog
Press any key to exit...

 

5. データベースの変更を処理する

次に、データベース スキーマに変更を加えます。変更を加えたら、モデルを更新してそれらの変更を反映することも必要です。

まず、データベース スキーマに変更を加えます。 スキーマに Users テーブルを追加します。

  • サーバー エクスプローラーで DatabaseFirst.Blogging データベースを右クリックし、[新しいクエリ] を選択します。
  • 次の SQL を新しいクエリにコピーし、クエリを右クリックして [実行] を選択します。
CREATE TABLE [dbo].[Users]
(
    [Username] NVARCHAR(50) NOT NULL PRIMARY KEY,  
    [DisplayName] NVARCHAR(MAX) NULL
)

スキーマが更新されたので、それらの変更でモデルを更新します。

  • EF Designer でモデルの空いている場所を右クリックし、[データベースからモデルを更新] を選択すると、更新ウィザードが起動します。

  • 更新ウィザードの [追加] タブで、[テーブル] の横のボックスをオンにします。これは、スキーマから新しいテーブルを追加することを示しています。 [更新] タブには、更新時に変更があるかどうかがチェックされる、モデル内の既存のテーブルが表示されます。 [削除] タブには、スキーマから削除されており、更新の一環としてモデルからも削除されるテーブルが表示されます。 この 2 つのタブの情報は自動的に検出され、情報提供のみを目的として提供されます。設定を変更することはできません。

    Refresh Wizard

  • 更新ウィザードで [完了] をクリックします。

 

モデルが更新され、データベースに追加した Users テーブルにマップされた新しい User エンティティが含まれるようになりました。

Model Updated

まとめ

このチュートリアルでは、既存のデータベースに基づいて EF Designer でモデルを作成できる、Database First 開発について説明しました。 次に、そのモデルを使用して、データベースに対してデータの読み取りと書き込みを行いました。 最後に、モデルを更新して、データベース スキーマに加えた変更を反映しました。