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

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

この記事のサンプルは GitHub で確認してくださいView this article's sample on GitHub.

必須コンポーネントPrerequisites

以下のソフトウェアをインストールします。Install the following software:

  • Visual Studio 2017 15.7 および以下のワークロード。Visual Studio 2017 15.7 with these workloads:
    • ASP.NET と Web 開発 ([Web & Cloud](Web とクラウド) の下)ASP.NET and web development (under Web & Cloud)
    • .NET Core クロスプラットフォームの開発 ([他のツールセット] の下).NET Core cross-platform development (under Other Toolsets)
  • .NET Core 2.1 SDK.NET Core 2.1 SDK.

Blogging データベースを作成するCreate 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, 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 > Visual C# > Web
  • [ASP.NET Core Web アプリケーション] プロジェクト テンプレートを選択しますSelect the ASP.NET Core Web Application 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
  • ターゲット フレームワークのドロップダウンが [.NET Core] に設定されており、バージョンのドロップダウンが [ASP.NET Core 2.1] に設定されていることを確認しますMake sure that the target framework dropdown is set to .NET Core, and the version dropdown is set to ASP.NET Core 2.1
  • [Web アプリケーション (モデル ビュー コントローラー)] テンプレートを選択しますSelect the Web Application (Model-View-Controller) template
  • [認証][認証なし] が設定されていることを確認します。Ensure that Authentication is set to No Authentication
  • [OK] をクリックします。Click OK

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

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

このチュートリアルでは、SQL Server を使用するため、プロバイダー パッケージをインストールする必要はありません。For this tutorial, you don't have to install a provider package because the tutorial uses SQL Server. この SQL Server のプロバイダー パッケージは、Microsoft.AspnetCore.App メタパッケージに含まれます。The SQL Server provider package is included in the Microsoft.AspnetCore.App metapackage.

モデルのリバース エンジニアリングを行う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. たとえば、-Tables Blog,Post のようにします。For example, -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. こちらが、BlogPost のエンティティ クラスです。Here are the Blog and Post entity classes:

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 ICollection<Post> Post { get; set; }
    }
}
using System;
using System.Collections.Generic;

namespace EFGetStarted.AspNetCore.ExistingDb.Models
{
    public partial class Post
    {
        public int PostId { get; set; }
        public int BlogId { get; set; }
        public string Content { get; set; }
        public string Title { get; set; }

        public Blog Blog { get; set; }
    }
}

ヒント

遅延読み込みを有効にするため、ナビゲーション プロパティ virtual を作成することができます (Blog.Post および Post.Blog)。To enable lazy loading, you can make navigation properties virtual (Blog.Post and Post.Blog).

コンテキストはデータベースのセッションを表しており、これによってエンティティ クラスのインスタンスにクエリを実行し保存できます。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 BloggingContext()
   {
   }

   public BloggingContext(DbContextOptions<BloggingContext> options)
       : base(options)
   {
   }

   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.

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

BloggingContext を MVC コント ローラーで使用できるようにするには、サービスとして登録します。To make BloggingContext available to MVC controllers, 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(...) メソッドを使用して、サービスとして登録できるようになりました。Now you can use the AddDbContext(...) method to register it as a service.

  • ConfigureServices(...) メソッドを見つけますLocate the ConfigureServices(...) method
  • 強調表示されている次のコードを追加して、コンテキストをサービスとして登録しますAdd the following highlighted 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.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    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 or environment variable. わかりやすくするために、このチュートリアルではコード内に定義します。For the sake of simplicity, this tutorial has you define it in code. 詳細については、「Connection Strings (接続文字列)」をご覧ください。For more information, see Connection Strings.

コントローラーとビューの作成Create a controller and views

  • ソリューション エクスプローラー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 builds and opens in a web browser
  • /Blogs に移動します。Navigate to /Blogs
  • [新規作成] をクリックします。Click Create New
  • 新しいブログの URL を入力して、[作成] をクリックします。Enter a Url for the new blog and click Create

イメージ

イメージ