新しいデータベースへの Code FirstCode First to a New Database

このビデオとステップバイステップのチュートリアルでは、新しいデータベースを対象とした Code First 開発の概要について説明します。This video and step-by-step walkthrough provide an introduction to Code First development targeting a new database. このシナリオには、存在しないデータベースのターゲット設定、Code First 作成されるデータベース、または Code First が新しいテーブルを追加する空のデータベースが対象となります。This scenario includes targeting a database that doesn’t exist and Code First will create, or an empty database that Code First will add new tables to. Code First では、C# または VB.Net クラスを使用してモデルを定義できます。Code First allows you to define your model using C# or VB.Net classes. 追加の構成は、必要に応じて、クラスやプロパティの属性、または fluent API を使用して実行できます。Additional configuration can optionally be performed using attributes on your classes and properties or by using a fluent API.

ビデオを見るWatch the video

このビデオでは、新しいデータベースを対象とした Code First 開発の概要について説明します。This video provides an introduction to Code First development targeting a new database. このシナリオには、存在しないデータベースのターゲット設定、Code First 作成されるデータベース、または Code First が新しいテーブルを追加する空のデータベースが対象となります。This scenario includes targeting a database that doesn’t exist and Code First will create, or an empty database that Code First will add new tables to. Code First では、または VB.Net クラスC#を使用してモデルを定義できます。Code First allows you to define your model using C# or VB.Net classes. 追加の構成は、必要に応じて、クラスやプロパティの属性、または fluent API を使用して実行できます。Additional configuration can optionally be performed using attributes on your classes and properties or by using a fluent API.

提供: Rowan MillerPresented By: Rowan Miller

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

前提条件Pre-Requisites

このチュートリアルを完了するには、少なくとも Visual Studio 2010 または Visual Studio 2012 がインストールされている必要があります。You will need to have at least Visual Studio 2010 or Visual Studio 2012 installed to complete this walkthrough.

Visual Studio 2010 を使用している場合は、 NuGetもインストールする必要があります。If you are using Visual Studio 2010, you will also need to have NuGet installed.

1. アプリケーションを作成する1. Create the Application

単純にするために、Code First を使用してデータアクセスを実行する基本的なコンソールアプリケーションを構築します。To keep things simple we’re going to build a basic console application that uses Code First to perform data access.

  • Visual Studio を開きますOpen Visual Studio
  • ファイル> 新規> プロジェクト...File -> New -> Project…
  • 左側のメニューとコンソールアプリケーションから [Windows] を選択します。Select Windows from the left menu and Console Application
  • 名前として「 Codefirstnewconnectionstring 」と入力します。Enter CodeFirstNewDatabaseSample as the name
  • [OK] を選択します。Select OK

2. モデルを作成する2. Create the Model

クラスを使用して、非常に単純なモデルを定義してみましょう。Let’s define a very simple model using classes. これらは Program.cs ファイルで定義するだけですが、実際のアプリケーションでは、クラスを別々のファイルに分割し、場合によっては別のプロジェクトに分割します。We’re just defining them in the Program.cs file but in a real world application you would split your classes out into separate files and potentially a separate project.

Program.cs の Program クラス定義の下に、次の2つのクラスを追加します。Below the Program class definition in Program.cs add the following two classes.

public class Blog
{
    public int BlogId { get; set; }
    public string Name { get; set; }

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

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public virtual Blog Blog { get; set; }
}

2つのナビゲーションプロパティ (ブログ、投稿、ブログ) が作成されていることがわかります。You’ll notice that we’re making the two navigation properties (Blog.Posts and Post.Blog) virtual. これにより、Entity Framework の遅延読み込み機能が有効になります。This enables the Lazy Loading feature of Entity Framework. 遅延読み込みとは、これらのプロパティにアクセスしようとしたときに、それらのプロパティの内容がデータベースから自動的に読み込まれることを意味します。Lazy Loading means that the contents of these properties will be automatically loaded from the database when you try to access them.

3. コンテキストを作成する3. Create a Context

次に、データベースとのセッションを表す派生コンテキストを定義します。これにより、データのクエリと保存が可能になります。Now it’s time to define a derived context, which represents a session with the database, allowing us to query and save data. ここでは、TEntity から派生し、モデル内のクラスごとに型指定された Dbcontext<> を公開するコンテキストを定義します。We define a context that derives from System.Data.Entity.DbContext and exposes a typed DbSet<TEntity> for each class in our model.

ここでは、Entity Framework の型の使用を開始しているため、EntityFramework NuGet パッケージを追加する必要があります。We’re now starting to use types from the Entity Framework so we need to add the EntityFramework NuGet package.

  • プロジェクト–> NuGet パッケージの管理...Project –> Manage NuGet Packages… 注: NuGet パッケージの管理...Note: If you don’t have the Manage NuGet Packages… オプションNuGet の最新バージョンをインストールする必要がありますoption you should install the latest version of NuGet
  • [オンライン] タブを選択します。Select the Online tab
  • Entityframeworkパッケージを選択しますSelect the EntityFramework package
  • [インストール] をクリックします。Click Install

Program.cs の先頭に、using ステートメントを追加します。Add a using statement for System.Data.Entity at the top of Program.cs.

using System.Data.Entity;

Program.cs の Post クラスの下に、次の派生コンテキストを追加します。Below the Post class in Program.cs add the following derived context.

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

ここでは、Program.cs に含まれる内容の完全な一覧を示します。Here is a complete listing of what Program.cs should now contain.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;

namespace CodeFirstNewDatabaseSample
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Name { get; set; }

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

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public virtual Blog Blog { get; set; }
    }

    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    }
}

これは、データの格納と取得を開始するために必要なすべてのコードです。That is all the code we need to start storing and retrieving data. 当然ながら、背後にはかなりの時間がかかりますが、それについては後で説明しますが、実際にはそれを実際に見てみましょう。Obviously there is quite a bit going on behind the scenes and we’ll take a look at that in a moment but first let’s see it in action.

4. データの読み取り & 書き込み4. Reading & Writing Data

次に示すように、Program.cs に Main メソッドを実装します。Implement the Main method in Program.cs as shown below. このコードは、コンテキストの新しいインスタンスを作成し、それを使用して新しいブログを挿入します。This code creates a new instance of our context and then uses it to insert a new Blog. 次に、LINQ クエリを使用して、データベースのすべてのブログをタイトル別にアルファベット順に並べ替えて取得します。Then it uses a LINQ query to retrieve all Blogs from the database ordered alphabetically by Title.

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();
        }
    }
}

これで、アプリケーションを実行してテストできるようになりました。You can now run the application and test it out.

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

データはどこにありますか?Where’s My Data?

慣例により、DbContext によってデータベースが作成されました。By convention DbContext has created a database for you.

  • ローカルの SQL Express インスタンスが使用可能な場合 (既定では Visual Studio 2010 がインストールされている場合)、Code First によってそのインスタンスにデータベースが作成されます。If a local SQL Express instance is available (installed by default with Visual Studio 2010) then Code First has created the database on that instance
  • SQL Express が使用できない場合、Code First はLocalDBを使用します (既定では Visual Studio 2012 と共にインストールされます)。If SQL Express isn’t available then Code First will try and use LocalDB (installed by default with Visual Studio 2012)
  • データベースには、派生コンテキストの完全修飾名の後に名前が付けられます。この例では、 Codefirstnewbfile です。The database is named after the fully qualified name of the derived context, in our case that is CodeFirstNewDatabaseSample.BloggingContext

これらは既定の規則であり、Code First 使用するデータベースを変更するにはさまざまな方法があります。詳細については、「 DbContext がモデルとデータベースの接続を検出する方法」を参照してください。These are just the default conventions and there are various ways to change the database that Code First uses, more information is available in the How DbContext Discovers the Model and Database Connection topic. このデータベースに接続するには、Visual Studio のサーバーエクスプローラーを使用します。You can connect to this database using Server Explorer in Visual Studio

  • ビュー> サーバーエクスプローラーView -> Server Explorer

  • [データ接続] を右クリックし、 [接続の追加] を選択します。Right click on Data Connections and select Add Connection…

  • サーバーエクスプローラーからデータベースに接続していない場合は、データソースとして Microsoft SQL Server を選択する必要があります。If you haven’t connected to a database from Server Explorer before you’ll need to select Microsoft SQL Server as the data source

    データ ソースの選択

  • インストールされているものに応じて、LocalDB または SQL Express に接続します。Connect to either LocalDB or SQL Express, depending on which one you have installed

Code First 作成されたスキーマを調査できるようになりました。We can now inspect the schema that Code First created.

スキーマの初期

DbContext は、定義した Dbcontext プロパティを参照して、モデルに含めるクラスを処理しました。DbContext worked out what classes to include in the model by looking at the DbSet properties that we defined. 次に、Code First 規則の既定のセットを使用して、テーブル名と列名の決定、データ型の確認、主キーの検索などを行います。It then uses the default set of Code First conventions to determine table and column names, determine data types, find primary keys, etc. このチュートリアルの後半では、これらの規則をオーバーライドする方法について説明します。Later in this walkthrough we’ll look at how you can override these conventions.

5. モデルの変更を処理する5. Dealing with Model Changes

次に、モデルに何らかの変更を加えてみましょう。これらの変更を行うときは、データベーススキーマも更新する必要があります。Now it’s time to make some changes to our model, when we make these changes we also need to update the database schema. これを行うには、Code First Migrations、または短い間の移行と呼ばれる機能を使用します。To do this we are going to use a feature called Code First Migrations, or Migrations for short.

移行により、データベーススキーマをアップグレード (およびダウングレード) する方法を説明する一連の手順を実行できます。Migrations allows us to have an ordered set of steps that describe how to upgrade (and downgrade) our database schema. これらの各手順 (移行と呼ばれます) には、適用される変更を説明するコードが含まれています。Each of these steps, known as a migration, contains some code that describes the changes to be applied. 

最初の手順では、BCode First Migrations コンテキストのを有効にします。The first step is to enable Code First Migrations for our BloggingContext.

  • ツール-> ライブラリパッケージマネージャー-> パッケージマネージャーコンソールTools -> Library Package Manager -> Package Manager Console

  • パッケージ マネージャー コンソールで Enable-Migrations コマンドを実行しますRun the Enable-Migrations command in Package Manager Console

  • 次の2つの項目を含む新しい [移行] フォルダーがプロジェクトに追加されました。A new Migrations folder has been added to our project that contains two items:

    • Configuration.cs –このファイルには、b コンテキストの移行に使用する設定が含まれています。Configuration.cs – This file contains the settings that Migrations will use for migrating BloggingContext. このチュートリアルでは何も変更する必要はありませんが、ここでは、シードデータを指定したり、他のデータベースのプロバイダーを登録したり、移行が生成される名前空間を変更したりできます。We don’t need to change anything for this walkthrough, but here is where you can specify seed data, register providers for other databases, changes the namespace that migrations are generated in etc.
    • <タイムスタンプ>_InitialCreate.cs –これは最初の移行です。これは、データベースに既に適用されている変更を表します。この変更は、ブログおよび投稿テーブルを含む空のデータベースにするためのものです。<timestamp>_InitialCreate.cs – This is your first migration, it represents the changes that have already been applied to the database to take it from being an empty database to one that includes the Blogs and Posts tables. これらのテーブルは Code First によって自動的に作成されるようになっていますが、移行に移行された移行を選択しました。Although we let Code First automatically create these tables for us, now that we have opted in to Migrations they have been converted into a Migration. Code First は、この移行が既に適用されているローカルデータベースにも記録されています。Code First has also recorded in our local database that this Migration has already been applied. ファイル名のタイムスタンプは、順序付けの目的で使用されます。The timestamp on the filename is used for ordering purposes.

    次に、モデルに変更を加え、ブログクラスに Url プロパティを追加します。Now let’s make a change to our model, add a Url property to the Blog class:

public class Blog
{
    public int BlogId { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }

    public virtual List<Post> Posts { get; set; }
}
  • パッケージマネージャーコンソールで、[追加-移行] AddUrlコマンドを実行します。Run the Add-Migration AddUrl command in Package Manager Console. [移行の追加] コマンドは、前回の移行以降に行われた変更を確認し、検出された変更を含む新しい移行をスキャフォールディングします。The Add-Migration command checks for changes since your last migration and scaffolds a new migration with any changes that are found. 移行に名前を付けることができます。この例では、移行 ' AddUrl ' を呼び出しています。We can give migrations a name; in this case we are calling the migration ‘AddUrl’. スキャフォールディングコードは、文字列データを保持できる Url 列を dbo に追加する必要があることを示しています。ブログテーブル。The scaffolded code is saying that we need to add a Url column, that can hold string data, to the dbo.Blogs table. 必要に応じて、スキャフォールディングコードを編集することもできますが、この場合は必要ありません。If needed, we could edit the scaffolded code but that’s not required in this case.
namespace CodeFirstNewDatabaseSample.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class AddUrl : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.Blogs", "Url", c => c.String());
        }

        public override void Down()
        {
            DropColumn("dbo.Blogs", "Url");
        }
    }
}
  • パッケージマネージャーコンソールで、データベースの更新コマンドを実行します。Run the Update-Database command in Package Manager Console. このコマンドを実行すると、保留中の移行がデータベースに適用されます。This command will apply any pending migrations to the database. InitialCreate 移行は既に適用されているので、移行によって新しい AddUrl 移行が適用されます。Our InitialCreate migration has already been applied so migrations will just apply our new AddUrl migration. ヒント: データベースに対して実行されている SQL を表示するには、 -Verboseスイッチを使用して、データベースに対して実行される SQL を確認します。Tip: You can use the –Verbose switch when calling Update-Database to see the SQL that is being executed against the database.

これで、新しい Url 列がデータベースのブログテーブルに追加されました。The new Url column is now added to the Blogs table in the database:

Url を含むスキーマ

6. データ注釈6. Data Annotations

ここまでで、EF では既定の規則を使用してモデルを検出できるようになりましたが、クラスが規則に従わず、さらに構成を実行できるようにする必要があります。So far we’ve just let EF discover the model using its default conventions, but there are going to be times when our classes don’t follow the conventions and we need to be able to perform further configuration. これには2つのオプションがあります。このセクションのデータ注釈については、次のセクションの fluent API を参照してください。There are two options for this; we’ll look at Data Annotations in this section and then the fluent API in the next section.

  • モデルにユーザークラスを追加してみましょう。Let’s add a User class to our model
public class User
{
    public string Username { get; set; }
    public string DisplayName { get; set; }
}
  • また、派生コンテキストにセットを追加する必要もあります。We also need to add a set to our derived context
public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
    public DbSet<User> Users { get; set; }
}
  • 移行を追加しようとすると、"EntityType ' User ' にキーが定義されていません" というエラーが表示されます。この EntityType のキーを定義します。 "If we tried to add a migration we’d get an error saying “EntityType ‘User’ has no key defined. Define the key for this EntityType.” EF では、ユーザー名がユーザーの主キーであることを把握する方法がありません。because EF has no way of knowing that Username should be the primary key for User.
  • ここではデータ注釈を使用します。そのため、Program.cs の先頭に using ステートメントを追加する必要があります。We’re going to use Data Annotations now so we need to add a using statement at the top of Program.cs
using System.ComponentModel.DataAnnotations;
  • 次に、ユーザー名プロパティに注釈を付けて、それが主キーであることを識別します。Now annotate the Username property to identify that it is the primary key
public class User
{
    [Key]
    public string Username { get; set; }
    public string DisplayName { get; set; }
}
  • スキャフォールディングを使用して移行を実行し、 これらの変更をデータベースに適用します。Use the Add-Migration AddUser command to scaffold a migration to apply these changes to the database
  • 新しい移行をデータベースに適用するには、データベースの更新コマンドを実行します。Run the Update-Database command to apply the new migration to the database

これで、新しいテーブルがデータベースに追加されました。The new table is now added to the database:

ユーザーを使用したスキーマ

EF でサポートされている注釈の完全な一覧は次のとおりです。The full list of annotations supported by EF is:

7. Fluent API7. Fluent API

前のセクションでは、データ注釈を使用して、規則によって検出された内容を補完またはオーバーライドする方法を説明しました。In the previous section we looked at using Data Annotations to supplement or override what was detected by convention. モデルを構成するもう1つの方法は、Code First fluent API を使用することです。The other way to configure the model is via the Code First fluent API.

ほとんどのモデル構成は、単純なデータ注釈を使用して実行できます。Most model configuration can be done using simple data annotations. Fluent API は、データ注釈では実現できない高度な構成に加えて、データ注釈が実行できるすべてのものを網羅したモデル構成を指定するより高度な方法です。The fluent API is a more advanced way of specifying model configuration that covers everything that data annotations can do in addition to some more advanced configuration not possible with data annotations. データ注釈と fluent API を一緒に使用することができます。Data annotations and the fluent API can be used together.

Fluent API にアクセスするには、DbContext で OnModelCreating メソッドをオーバーライドします。To access the fluent API you override the OnModelCreating method in DbContext. _名を表示するために、ユーザー DisplayName が格納されている列の名前を変更したいとします。Let’s say we wanted to rename the column that User.DisplayName is stored in to display_name.

  • 次のコードを使用して、BloggingContext で OnModelCreating メソッドをオーバーライドします。Override the OnModelCreating method on BloggingContext with the following code
public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .Property(u => u.DisplayName)
            .HasColumnName("display_name");
    }
}
  • スキャフォールディングを使用して移行を実行し、 これらの変更をデータベースに適用します。Use the Add-Migration ChangeDisplayName command to scaffold a migration to apply these changes to the database.
  • 新しい移行をデータベースに適用するには、データベースの更新コマンドを実行します。Run the Update-Database command to apply the new migration to the database.

DisplayName 列の名前が変更され、_名が表示されるようになりました。The DisplayName column is now renamed to display_name:

表示名が変更されたスキーマ

まとめSummary

このチュートリアルでは、新しいデータベースを使用した Code First 開発について説明しました。In this walkthrough we looked at Code First development using a new database. クラスを使用してモデルを定義した後、そのモデルを使用してデータベースを作成し、データを格納および取得します。We defined a model using classes then used that model to create a database and store and retrieve data. データベースを作成した後は、モデルの進化に従ってスキーマを変更するために Code First Migrations を使用しました。Once the database was created we used Code First Migrations to change the schema as our model evolved. また、データ注釈と Fluent API を使用してモデルを構成する方法についても説明しました。We also saw how to configure a model using Data Annotations and the Fluent API.