既存のデータベースを使用した ASP.NET Core での EF Core の概要Getting Started with EF Core on ASP.NET Core with an Existing Database

このチュートリアルでは、Entity Framework を使用して基本的なデータ アクセスを実行する ASP.NET Core MVC アプリケーションを作成します。In this walkthrough, you will build an ASP.NET Core MVC application that performs basic data access using Entity Framework. 既存のデータベースに基づく Entity Framework モデルを作成するために、リバース エンジニアリングを使用します。You will use reverse engineering to create an Entity Framework model based on an existing database.

ヒント

この記事のサンプルは GitHub で確認できます。You can view this article's sample on GitHub.

必須コンポーネントPrerequisites

このチュートリアルを完了するには、次の条件を満たす必要があります。The following prerequisites are needed to complete this walkthrough:

Blogging データベースBlogging database

このチュートリアルでは、お使いの LocalDb インスタンス上の Blogging データベースを、既存のデータベースとして使用します。This tutorial uses a Blogging database on your LocalDb instance as the existing database.

ヒント

Blogging データベースを、別のチュートリアルの一部として既に作成している場合は、次の手順を省略できます。If you have already created the Blogging database as part of another tutorial, you can skip these steps.

  • Visual Studio を開くOpen Visual Studio
  • [ツール] -> [データベースへの接続]Tools -> Connect to Database...
  • [Microsoft SQL Server] を選択して [続行] をクリックします。Select Microsoft SQL Server and click Continue
  • [サーバー名] に「(localdb) \mssqllocaldb」を入力します。Enter (localdb)\mssqllocaldb as the Server Name
  • [データベース名] に「master」を入力して [OK] をクリックします。Enter master as the Database Name and click OK
  • [サーバー エクスプローラー] 内の [データ接続] の下に、master データベースが表示されるようになりました。The master database is now displayed under Data Connections in Server Explorer
  • [サーバー エクスプローラー] でこのデータベースを右クリックし、[新しいクエリ] を選択します。Right-click on the database in Server Explorer and select New Query
  • 以下に表示されているスクリプトを、クエリ エディターにコピーしますCopy the script, listed below, into the query editor
  • クエリ エディターを右クリックし、[実行] を選択します。Right-click on the query editor and select Execute
CREATE DATABASE [Blogging];
GO

USE [Blogging];
GO

CREATE TABLE [Blog] (
    [BlogId] int NOT NULL IDENTITY,
    [Url] nvarchar(max) NOT NULL,
    CONSTRAINT [PK_Blog] PRIMARY KEY ([BlogId])
);
GO

CREATE TABLE [Post] (
    [PostId] int NOT NULL IDENTITY,
    [BlogId] int NOT NULL,
    [Content] nvarchar(max),
    [Title] nvarchar(max),
    CONSTRAINT [PK_Post] PRIMARY KEY ([PostId]),
    CONSTRAINT [FK_Post_Blog_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blog] ([BlogId]) ON DELETE CASCADE
);
GO

INSERT INTO [Blog] (Url) VALUES
('http://blogs.msdn.com/dotnet'),
('http://blogs.msdn.com/webdev'),
('http://blogs.msdn.com/visualstudio')
GO

新しいプロジェクトを作成するCreate a new project

  • Visual Studio 2017 を開きますOpen Visual Studio 2017
  • [ファイル] -> [新規] -> [プロジェクト...]File -> New -> Project...
  • 左側のメニューから [インストール済み] -> [テンプレート] -> [Visual C#] -> [Web] の順に選択します。From the left menu select Installed -> Templates -> Visual C# -> Web
  • [ASP.NET Core Web アプリケーション (.NET Core)] プロジェクト テンプレートを選択します。Select the ASP.NET Core Web Application (.NET Core) project template
  • 名前に「EFGetStarted.AspNetCore.ExistingDb」を入力して [OK] をクリックしますEnter EFGetStarted.AspNetCore.ExistingDb as the name and click OK
  • [新しい ASP.NET Core Web アプリケーション] ダイアログが表示されるのを待ちますWait for the New ASP.NET Core Web Application dialog to appear
  • [ASP.NET Core Templates 2.0](ASP.NET Core テンプレート 2.0) で、[Web アプリケーション (モデル ビュー コントローラー)] を選択します。Under ASP.NET Core Templates 2.0 select the Web Application (Model-View-Controller)
  • [認証][認証なし] が設定されていることを確認します。Ensure that Authentication is set to No Authentication
  • [OK] をクリックします。Click OK

Entity Framework をインストールするInstall Entity Framework

EF Core を使用するには、対象となるデータベース プロバイダーのパッケージをインストールします。To use EF Core, install the package for the database provider(s) you want to target. このチュートリアルでは SQL Server を使用します。This walkthrough uses SQL Server. 使用可能なプロバイダーの一覧については、「Database Providers (データベース プロバイダー)」をご覧ください。For a list of available providers see Database Providers.

  • [ツール] > [NuGet パッケージ マネージャー] > [パッケージ マネージャー コンソール]Tools > NuGet Package Manager > Package Manager Console

  • Install-Package Microsoft.EntityFrameworkCore.SqlServer を実行します。Run Install-Package Microsoft.EntityFrameworkCore.SqlServer

いくつかの Entity Framework Tools を使用して、データベースからモデルを作成します。We will be using some Entity Framework Tools to create a model from the database. そのため、ツールのパッケージをインストールします。So we will install the tools package as well:

  • Install-Package Microsoft.EntityFrameworkCore.Tools を実行します。Run Install-Package Microsoft.EntityFrameworkCore.Tools

後で、いくつかの ASP.NET Core スキャフォールディング ツールを使用して、コント ローラーとビューを作成します。We will be using some ASP.NET Core Scaffolding tools to create controllers and views later on. そのため、このデザイン パッケージもインストールします。So we will install this design package as well:

  • Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design を実行します。Run Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

モデルのリバース エンジニアリングを行うReverse engineer your model

ここで、お使いの既存のデータベースに基づいて、EF モデルを作成します。Now it's time to create the EF model based on your existing database.

  • [ツール] –> [NuGet パッケージ マネージャー] –> [パッケージ マネージャー コンソール]Tools –> NuGet Package Manager –> Package Manager Console
  • 次のコマンドを実行して、既存のデータベースからモデルを作成します。Run the following command to create a model from the existing database:
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

The term 'Scaffold-DbContext' is not recognized as the name of a cmdlet という内容のエラーが表示された場合は、Visual Studio を閉じて再度開きます。If you receive an error stating The term 'Scaffold-DbContext' is not recognized as the name of a cmdlet, then close and reopen Visual Studio.

ヒント

上記のコマンドに引数 -Tables を追加すると、エンティティを生成するテーブルを指定できます。You can specify which tables you want to generate entities for by adding the -Tables argument to the command above. たとえば、E.g. -Tables Blog,Post-Tables Blog,Post.

リバース エンジニアリングのプロセスにより、既存のデータベースのスキーマに基づいてエンティティ クラス (Blog.cs & Post.cs) と派生コンテキスト (BloggingContext.cs) が作成されます。The reverse engineer process created entity classes (Blog.cs & Post.cs) and a derived context (BloggingContext.cs) based on the schema of the existing database.

エンティティ クラスはクエリを実行し保存するデータを表す、単純な C# オブジェクトです。The entity classes are simple C# objects that represent the data you will be querying and saving.

using System;
using System.Collections.Generic;

namespace EFGetStarted.AspNetCore.ExistingDb.Models
{
    public partial class Blog
    {
        public Blog()
        {
            Post = new HashSet<Post>();
        }

        public int BlogId { get; set; }
        public string Url { get; set; }

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

コンテキストはデータベースのセッションを表しており、これによってエンティティ クラスのインスタンスにクエリを実行し保存できます。The context represents a session with the database and allows you to query and save instances of the entity classes.

public partial class BloggingContext : DbContext
{
   public virtual DbSet<Blog> Blog { get; set; }
   public virtual DbSet<Post> Post { get; set; }

   protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
   {
       if (!optionsBuilder.IsConfigured)
       {
           #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
           optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;");
       }
   }

   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
       modelBuilder.Entity<Blog>(entity =>
       {
           entity.Property(e => e.Url).IsRequired();
       });

       modelBuilder.Entity<Post>(entity =>
       {
           entity.HasOne(d => d.Blog)
               .WithMany(p => p.Post)
               .HasForeignKey(d => d.BlogId);
       });
   }
}

依存関係の挿入にコンテキストを登録します。Register your context with dependency injection

依存関係の挿入の概念は、ASP.NET Core の中心となるものです。The concept of dependency injection is central to ASP.NET Core. サービス (BloggingContext など) は、アプリケーションの起動時に依存関係の挿入に登録されます。Services (such as BloggingContext) are registered with dependency injection during application startup. これらのサービス (MVC コント ローラーなど) を必要とするコンポーネントには、コンス トラクターのパラメーターまたはプロパティを介してこれらのサービスが指定されます。Components that require these services (such as your MVC controllers) are then provided these services via constructor parameters or properties. 依存関係の挿入の詳細については、ASP.NET サイトの依存関係の挿入に関する記事をご覧ください。For more information on dependency injection see the Dependency Injection article on the ASP.NET site.

インライン コンテキスト構成の削除Remove inline context configuration

ASP.NET Core では、Startup.cs 内で構成を行うのが一般的です。In ASP.NET Core, configuration is generally performed in Startup.cs. このパターンに合わせるために、データベース プロバイダーの構成を Startup.cs に移動します。To conform to this pattern, we will move configuration of the database provider to Startup.cs.

  • Models\BloggingContext.cs を開きますOpen Models\BloggingContext.cs
  • OnConfiguring(...) メソッドを削除しますDelete the OnConfiguring(...) method
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
    optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;");
}
  • 次のコンストラクターを追加すると、依存関係の挿入によって構成をコンテキストに渡すことができます。Add the following constructor, which will allow configuration to be passed into the context by dependency injection
public BloggingContext(DbContextOptions<BloggingContext> options)
    : base(options)
{ }

Startup.cs にコンテキストを登録して構成するRegister and configure your context in Startup.cs

MVC コントローラーで利用するために、BloggingContext をサービスとして登録します。In order for our MVC controllers to make use of BloggingContext we are going to register it as a service.

  • Startup.cs を開きます。Open Startup.cs
  • ファイルの先頭に次の using ステートメントを追加しますAdd the following using statements at the start of the file
using EFGetStarted.AspNetCore.ExistingDb.Models;
using Microsoft.EntityFrameworkCore;

AddDbContext(...) メソッドを使用して、BloggingContext をサービスとして登録できるようになりました。Now we can use the AddDbContext(...) method to register it as a service.

  • ConfigureServices(...) メソッドを見つけますLocate the ConfigureServices(...) method
  • 次のコードを追加して、コンテキストをサービスとして登録しますAdd the following code to register the context as a service
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    var connection = @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;ConnectRetryCount=0";
    services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));
}

ヒント

実際のアプリケーションでは、接続文字列は構成ファイルに記述するのが一般的です。In a real application you would typically put the connection string in a configuration file. わかりやすくするために、接続文字列はコード内に定義しています。For the sake of simplicity, we are defining it in code. 詳細については、「Connection Strings (接続文字列)」をご覧ください。For more information, see Connection Strings.

コントローラーを作成するCreate a controller

次に、プロジェクトでスキャフォールディングを有効にします。Next, we'll enable scaffolding in our project.

  • ソリューション エクスプローラーControllers フォルダーを右クリックし、[追加] -> [コントローラー] の順に選択します。Right-click on the Controllers folder in Solution Explorer and select Add -> Controller...
  • [完全な依存関係] を選択して [追加] をクリックします。Select Full Dependencies and click Add
  • 開いた ScaffoldingReadMe.txt ファイル内の指示は無視してかまいません。You can ignore the instructions in the ScaffoldingReadMe.txt file that opens

スキャフォールディングが有効になったら、Blog エンティティのコントローラーをスキャフォールディングできます。Now that scaffolding is enabled, we can scaffold a controller for the Blog entity.

  • ソリューション エクスプローラーControllers フォルダーを右クリックし、[追加] -> [コントローラー] の順に選択します。Right-click on the Controllers folder in Solution Explorer and select Add -> Controller...
  • [Entity Framework を使用したビューがある MVC コントローラー] を選択し、[OK] をクリックします。Select MVC Controller with views, using Entity Framework and click Ok
  • [モデル クラス]Blog を、[データ コンテキスト クラス][BloggingContext] を設定します。Set Model class to Blog and Data context class to BloggingContext
  • [追加] をクリックします。Click Add

アプリケーションの実行Run the application

アプリケーションを実行して動作を確認できるようになりました。You can now run the application to see it in action.

  • [デバッグ] -> [デバッグなしで開始]Debug -> Start Without Debugging
  • アプリケーションが作成され、Web ブラウザー上で開かれます。The application will build and open in a web browser
  • /Blogs に移動します。Navigate to /Blogs
  • [新規作成] をクリックします。Click Create New
  • 新しいブログの URL を入力して、[作成] をクリックします。Enter a Url for the new blog and click Create

イメージ

イメージ