既存のデータベースへの Code First

このステップバイステップのチュートリアルでは、既存のデータベースを対象とした Code First 開発の概要を説明します。 Code First を使用すると、C# または VB.Net クラスを使用してモデルを定義できます。 必要に応じて、クラスおよびプロパティの属性を使用するか、または fluent API を使用して、追加の構成を行うことができます。

前提条件

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

また、バージョン 6.1 以降の Entity Framework Tools for Visual Studio もインストールされている必要があります。 最新バージョンの Entity Framework Tools のインストールについては、「Entity Framework を入手する」を参照してください。

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

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

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

  • Visual Studio を開きます

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

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

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

    Select Data Source

  • LocalDB インスタンスに接続し、データベース名として「Blogging」と入力します。

    LocalDB Connection

  • [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
);

INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('The Visual Studio Blog', 'http://blogs.msdn.com/visualstudio/')

INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('.NET Framework Blog', 'http://blogs.msdn.com/dotnet/')

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

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

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

 

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

Entity Framework Tools for Visual Studio を使用して、データベースにマップするための初期コードを生成できます。 これらのツールによって生成されるコードは、必要に応じて手動で入力することもできます。

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

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

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

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

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

    Wizard One CFE

  • 最初のセクションで作成したデータベースへの接続を選択し、[次へ] をクリックします。

    Wizard Two CFE

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

    Wizard Three CFE

リバース エンジニアリング プロセスが完了すると、プロジェクトに多数の項目が追加されています。追加された項目を見てみましょう。

構成ファイル

プロジェクトに App.config ファイルが追加されています。このファイルには、既存のデータベースへの接続文字列が含まれています。

<connectionStrings>
  <add  
    name="BloggingContext"  
    connectionString="data source=(localdb)\mssqllocaldb;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"  
    providerName="System.Data.SqlClient" />
</connectionStrings>

構成ファイルには他の設定も含まれています。これらは、データベースを作成する場所を Code First に指示する EF の既定の設定です。 ここでは既存のデータベースにマップするので、これらの設定はアプリケーションでは無視されます。

派生コンテキスト

プロジェクトに BloggingContext クラスが追加されています。 このコンテキストは、データベースとのセッションを表し、クエリを実行してデータを保存できるようにします。 このコンテキストでは、モデル内の型ごとに DbSet<TEntity> を公開します。 また、既定のコンストラクターで name= 構文を使用して基本コンストラクターを呼び出していることもわかります。 これにより、このコンテキストに使用する接続文字列を構成ファイルから読み込む必要があることを Code First に通知します。

public partial class BloggingContext : DbContext
    {
        public BloggingContext()
            : base("name=BloggingContext")
        {
        }

        public virtual DbSet<Blog> Blogs { get; set; }
        public virtual DbSet<Post> Posts { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }
    }

構成ファイル内の接続文字列を使用する場合は、常に name= 構文を使用する必要があります。 これにより、接続文字列が存在しない場合に、Entity Framework は規約に従って新しいデータベースを作成するのではなく、スローすることが保証されます。

モデル クラス。

最後に、Blog クラスと Post クラスもプロジェクトに追加されています。 これらはモデルを構成するドメイン クラスです。 Code First の規約が既存のデータベースの構造に合っていない場合に構成を指定するために、データ注釈がクラスに適用されています。 たとえば、Blog.NameBlog.Url は、データベース内での最大長が 200 であるため、StringLength 注釈が適用されています (Code First では、データベース プロバイダーでサポートされている最大長 (SQL Server では nvarchar(max)) が既定で使用されます)。

public partial class Blog
{
    public Blog()
    {
        Posts = new HashSet<Post>();
    }

    public int BlogId { get; set; }

    [StringLength(200)]
    public string Name { get; set; }

    [StringLength(200)]
    public string Url { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

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

モデルを用意できたので、それを使用してデータにアクセスしてみましょう。 次に示すように、Program.csMain メソッドを実装します。 このコードでは、コンテキストの新しいインスタンスを作成し、それを使用して新しい 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:
.NET Framework Blog
ADO.NET Blog
The Visual Studio Blog
Press any key to exit...

 

データベースが変更された場合

Code First to Database\(データベースへの Code First\) ウィザードは、出発点として使用し、調整および変更できる一連のクラスを生成するように設計されています。 データベース スキーマが変更された場合は、クラスを手動で編集することも、別のリバース エンジニアリングを実行してクラスを上書きすることもできます。

既存のデータベースへの Code First Migrations の使用

既存のデータベースで Code First Migrations を使用する場合は、既存のデータベースへの Code First Migrations に関する記事を参照してください。

まとめ

このチュートリアルでは、既存のデータベースを使用した Code First 開発について説明しました。 Entity Framework Tools for Visual Studio を使用して、データベースにマップされ、データの保存と取得に使用できる一連のクラスをリバース エンジニアリングしました。