ASP.NET Core MVC と Entity Framework Core - チュートリアル 1 (全 10 回)ASP.NET Core MVC with Entity Framework Core - Tutorial 1 of 10

作成者: Tom DykstraRick AndersonBy Tom Dykstra and Rick Anderson

このチュートリアルでは、ASP.NET Core MVC と Entity Framework Core のコントローラーとビューについて説明します。This tutorial teaches ASP.NET Core MVC and Entity Framework Core with controllers and views. ASP.NET Core 2.0 の新しい代替である Razor ページはページ ベースのプログラミング モデルであり、Web UI の開発を容易にし、生産性を高めます。Razor Pages is a new alternative in ASP.NET Core 2.0, a page-based programming model that makes building web UI easier and more productive. MVC のバージョンよりも Razor ページのチュートリアルをお勧めします。We recommend the Razor Pages tutorial over the MVC version. この Razor ページのチュートリアルの特徴は次のとおりです。The Razor Pages tutorial:

  • 使いやすい。Is easier to follow.
  • より多くの EF Core のベスト プラクティスが提供されている。Provides more EF Core best practices.
  • より効率的なクエリを使用している。Uses more efficient queries.
  • より最新の API を使用している。Is more current with the latest API.
  • 多くの機能をカバーしている。Covers more features.
  • 新しいアプリケーションの開発で推奨されるアプローチである。Is the preferred approach for new application development.

Razor ページ バージョンではなくこのチュートリアルを選択する場合は、この GitHub の発行でその理由をお知らせください。If you choose this tutorial over the Razor Pages version, let us know why in this GitHub issue.

Contoso University のサンプル Web アプリケーションでは、Entity Framework (EF) Core 2.0 と Visual Studio 2017 を使用して ASP.NET Core 2.0 MVC Web アプリケーションを作成する方法を示します。The Contoso University sample web application demonstrates how to create ASP.NET Core 2.0 MVC web applications using Entity Framework (EF) Core 2.0 and Visual Studio 2017.

サンプル アプリケーションは架空の Contoso University の Web サイトです。The sample application is a web site for a fictional Contoso University. 学生の受け付け、講座の作成、講師の割り当てなどの機能が含まれています。It includes functionality such as student admission, course creation, and instructor assignments. これは、Contoso University のサンプル アプリケーションを一から作成する方法を説明するチュートリアル シリーズの 1 回目です。This is the first in a series of tutorials that explain how to build the Contoso University sample application from scratch.

完成したアプリケーションをダウンロードまたは表示する。Download or view the completed application.

EF Core 2.0 は EF の最新版ですが、EF 6.x の一部の機能にまだ対応していません。EF Core 2.0 is the latest version of EF but doesn't yet have all the features of EF 6.x. EF 6.x と EF Core のどちらを選択するかについては、「EF Core と EF 6.x を比較する」を参照してください。For information about how to choose between EF 6.x and EF Core, see EF Core vs. EF6.x. EF 6.x を選択する場合、このチュートリアル シリーズの以前のバージョンを参照してください。If you choose EF 6.x, see the previous version of this tutorial series.

注意

必須コンポーネントPrerequisites

Install one of the following:

トラブルシューティングTroubleshooting

解決できない問題に遭遇した場合、通常、完成済みのプロジェクトと自分のコードを比較することで解決策がわかります。If you run into a problem you can't resolve, you can generally find the solution by comparing your code to the completed project. 一般的なエラーとその解決方法の一覧については、チュートリアル シリーズの後半に登場するトラブルシューティング セクションをご覧ください。For a list of common errors and how to solve them, see the Troubleshooting section of the last tutorial in the series. そこで必要な答えが見つからない場合、StackOverflow.com で ASP.NET Core または EF Core に関する質問を投稿できます。If you don't find what you need there, you can post a question to StackOverflow.com for ASP.NET Core or EF Core.

ヒント

これは 10 回のチュートリアルからなるシリーズであり、いずれの回も前のチュートリアルを基盤にしています。This is a series of 10 tutorials, each of which builds on what is done in earlier tutorials. チュートリアルが完了したら、毎回、プロジェクトのコピーを保存するようお勧めします。Consider saving a copy of the project after each successful tutorial completion. 問題に遭遇したとき、前のチュートリアルから始めることができます。シリーズ全体の始めまで戻る必要がありません。Then if you run into problems, you can start over from the previous tutorial instead of going back to the beginning of the whole series.

Contoso University Web アプリケーションThe Contoso University web application

一連のチュートリアルで作成するアプリケーションは、簡単な大学向け Web サイトです。The application you'll be building in these tutorials is a simple university web site.

ユーザーは学生、講座、講師の情報を見たり、更新したりできます。Users can view and update student, course, and instructor information. 次のような画面をこれから作成します。Here are a few of the screens you'll create.

Students インデックス ページ

Students 編集ページ

このサイトの UI スタイルは、組み込みテンプレートで生成されるスタイルに近いものになっています。それにより、このチュートリアルでは主に、Entity Framework の使い方を取り上げることができます。The UI style of this site has been kept close to what's generated by the built-in templates, so that the tutorial can focus mainly on how to use the Entity Framework.

ASP.NET Core MVC Web アプリケーションを作成するCreate an ASP.NET Core MVC web application

Visual Studio を開き、新しい ASP.NET Core C# Web プロジェクトを作成します。プロジェクトの名前は "ContosoUniversity" です。Open Visual Studio and create a new ASP.NET Core C# web project named "ContosoUniversity".

  • [ファイル] メニューで [新規作成]、[プロジェクト] の順に選択します。From the File menu, select New > Project.

  • 左側のウィンドウで、[インストール済み]、[Visual C#]、[Web] の順に選択します。From the left pane, select Installed > Visual C# > Web.

  • [ASP.NET Core Web アプリケーション] プロジェクト テンプレートを選択します。Select the ASP.NET Core Web Application project template.

  • 名前に「ContosoUniversity」と入力し、[OK] をクリックします。Enter ContosoUniversity as the name and click OK.

    [新しいプロジェクト] ダイアログ

  • [新しい ASP.NET Core Web アプリケーション (.NET Core)] ダイアログが表示されるのを待ちますWait for the New ASP.NET Core Web Application (.NET Core) dialog to appear

  • [ASP.NET Core 2.0][Web アプリケーション (モデル ビュー コントローラー)] テンプレートを選択します。Select ASP.NET Core 2.0 and the Web Application (Model-View-Controller) template.

    注: このチュートリアルには、2.0 以降の ASP.NET Core と EF Core が必要です。ASP.NET Core 1.1 が選択されていないことを確認してください。Note: This tutorial requires ASP.NET Core 2.0 and EF Core 2.0 or later -- make sure that ASP.NET Core 1.1 isn't selected.

  • [認証][認証なし] が設定されていることを確認してください。Make sure Authentication is set to No Authentication.

  • [OK] をクリックします。Click OK

    [新しい ASP.NET プロジェクト] ダイアログ

サイトのスタイルを設定するSet up the site style

簡単な変更をいくつか行い、サイトのメニュー、レイアウト、ホーム ページを決めます。A few simple changes will set up the site menu, layout, and home page.

Views/Shared/_Layout.cshtml を開き、次のように変更します。Open Views/Shared/_Layout.cshtml and make the following changes:

  • "ContosoUniversity" をすべて "Contoso University" に変更します。Change each occurrence of "ContosoUniversity" to "Contoso University". これは 3 回出てきます。There are three occurrences.

  • メニュー エントリとして「Students」、「Courses」、「Instructors」、「Departments」を追加し、「Contact」を削除します。Add menu entries for Students, Courses, Instructors, and Departments, and delete the Contact menu entry.

変更が強調表示されます。The changes are highlighted.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - Contoso University</title>

    <environment names="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment names="Staging,Production">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
    
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">Contoso University</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-area="" asp-controller="Students" asp-action="Index">Students</a></li>
                    <li><a asp-area="" asp-controller="Courses" asp-action="Index">Courses</a></li>
                    <li><a asp-area="" asp-controller="Instructors" asp-action="Index">Instructors</a></li>
                    <li><a asp-area="" asp-controller="Departments" asp-action="Index">Departments</a></li>
                </ul>
            </div>
        </div>
    </nav>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2017 - Contoso University</p>
        </footer>
    </div>

    <environment names="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment names="Staging,Production">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>

Views/Home/Index.cshtml で、ファイルの中身を次のコードに変更し、ASP.NET と MVC に関するテキストをこのアプリケーションに関するテキストに変更します。In Views/Home/Index.cshtml, replace the contents of the file with the following code to replace the text about ASP.NET and MVC with text about this application:

@{
    ViewData["Title"] = "Home Page";
}

<div class="jumbotron">
    <h1>Contoso University</h1>
</div>
<div class="row">
    <div class="col-md-4">
        <h2>Welcome to Contoso University</h2>
        <p>
            Contoso University is a sample application that
            demonstrates how to use Entity Framework Core in an
            ASP.NET Core MVC web application.
        </p>
    </div>
    <div class="col-md-4">
        <h2>Build it from scratch</h2>
        <p>You can build the application by following the steps in a series of tutorials.</p>
        <p><a class="btn btn-default" href="https://docs.asp.net/en/latest/data/ef-mvc/intro.html">See the tutorial &raquo;</a></p>
    </div>
    <div class="col-md-4">
        <h2>Download it</h2>
        <p>You can download the completed project from GitHub.</p>
        <p><a class="btn btn-default" href="https://github.com/aspnet/Docs/tree/master/aspnetcore/data/ef-mvc/intro/samples/cu-final">See project source code &raquo;</a></p>
    </div>
</div>

CTRL を押しながら F5 を押してプロジェクトを実行するか、メニューで [デバッグ]、[デバッグなしで開始] の順に選択します。Press CTRL+F5 to run the project or choose Debug > Start Without Debugging from the menu. 一連のチュートリアルで作成するページのホーム ページとタブが表示されます。You see the home page with tabs for the pages you'll create in these tutorials.

Contoso University のホーム ページ

Entity Framework Core NuGet パッケージEntity Framework Core NuGet packages

プロジェクトに EF Core サポートを追加するには、対象とするデータベース プロバイダーをインストールします。To add EF Core support to a project, install the database provider that you want to target. このチュートリアルでは SQL Server を使用します。プロバイダー パッケージは Microsoft.EntityFrameworkCore.SqlServer です。This tutorial uses SQL Server, and the provider package is Microsoft.EntityFrameworkCore.SqlServer. このパッケージは Microsoft.AspNetCore.All メタパッケージに含まれています。インストールする必要はありません。This package is included in the Microsoft.AspNetCore.All metapackage, so you don't have to install it.

このパッケージとその依存関係 (Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.Relational) により、EF のランタイム サポートが与えられます。This package and its dependencies (Microsoft.EntityFrameworkCore and Microsoft.EntityFrameworkCore.Relational) provide runtime support for EF. 後の移行チュートリアルでツール パッケージを追加します。You'll add a tooling package later, in the Migrations tutorial.

Entity Framework Core で利用できるその他のデータベース プロバイダーに関しては、「データベース プロバイダー」を参照してください。For information about other database providers that are available for Entity Framework Core, see Database providers.

データ モデルの作成Create the data model

次に、Contoso University アプリケーションのエンティティ クラスを作成します。Next you'll create entity classes for the Contoso University application. 次の 3 つのエンティティから始めます。You'll start with the following three entities.

講座、登録、学生からなるデータ モデルの図

Student エンティティと Enrollment エンティティの間に一対多の関係があり、Course エンティティと Enrollment エンティティの間に一対多の関係があります。There's a one-to-many relationship between Student and Enrollment entities, and there's a one-to-many relationship between Course and Enrollment entities. 言い換えると、1 人の学生をさまざまな講座に登録し、1 つの講座にたくさんの学生を登録できます。In other words, a student can be enrolled in any number of courses, and a course can have any number of students enrolled in it.

次のセクションでは、エンティティごとにクラスを作成します。In the following sections you'll create a class for each one of these entities.

Student エンティティThe Student entity

Student エンティティの図

[Models] フォルダーで、Student.cs という名前のクラス ファイルを作成し、テンプレート コードを次のコードに変更します。In the Models folder, create a class file named Student.cs and replace the template code with the following code.

using System;
using System.Collections.Generic;

namespace ContosoUniversity.Models
{
    public class Student
    {
        public int ID { get; set; }
        public string LastName { get; set; }
        public string FirstMidName { get; set; }
        public DateTime EnrollmentDate { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }
    }
}

ID プロパティは、このクラスに相当するデータベース テーブルの主キー列になります。The ID property will become the primary key column of the database table that corresponds to this class. 既定では、Entity Framework は、ID または classnameID という名前のプロパティを主キーとして解釈します。By default, the Entity Framework interprets a property that's named ID or classnameID as the primary key.

Enrollments プロパティはナビゲーション プロパティです。The Enrollments property is a navigation property. ナビゲーション プロパティには、このエンティティに関連する他のエンティティが含まれます。Navigation properties hold other entities that are related to this entity. この例では、Student entityEnrollments プロパティで、その Student エンティティに関連するすべての Enrollment エンティティが保持されます。In this case, the Enrollments property of a Student entity will hold all of the Enrollment entities that are related to that Student entity. つまり、データベースの Student 行にある 2 つの Enrollment 行が関連している場合 (外部キー列 StudentID にその学生の主キー値が含まれる行)、その Student エンティティの Enrollments ナビゲーション プロパティにその 2 つの Enrollment エンティティが含まれます。In other words, if a given Student row in the database has two related Enrollment rows (rows that contain that student's primary key value in their StudentID foreign key column), that Student entity's Enrollments navigation property will contain those two Enrollment entities.

ナビゲーション プロパティに複数のエンティティが含まれる場合 (多対多または一対多の関係で)、その型はリストにする必要があります。ICollection<T> のように、エンティティを追加、削除、更新できるリストです。If a navigation property can hold multiple entities (as in many-to-many or one-to-many relationships), its type must be a list in which entries can be added, deleted, and updated, such as ICollection<T>. ICollection<T>、または List<T>HashSet<T> などの型を指定することができます。You can specify ICollection<T> or a type such as List<T> or HashSet<T>. ICollection<T> を指定した場合、EF では既定で HashSet<T> コレクションが作成されます。If you specify ICollection<T>, EF creates a HashSet<T> collection by default.

Enrollment エンティティThe Enrollment entity

Enrollment エンティティの図

[Models] フォルダーで、Enrollment.cs を作成し、既存のコードを次のコードに変更します。In the Models folder, create Enrollment.cs and replace the existing code with the following code:

namespace ContosoUniversity.Models
{
    public enum Grade
    {
        A, B, C, D, F
    }

    public class Enrollment
    {
        public int EnrollmentID { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
        public Grade? Grade { get; set; }

        public Course Course { get; set; }
        public Student Student { get; set; }
    }
}

EnrollmentID プロパティは主キーになります。このエンティティは、Student エンティティと同様に、ID ではなく classnameID パターンを使用します。The EnrollmentID property will be the primary key; this entity uses the classnameID pattern instead of ID by itself as you saw in the Student entity. 通常、パターンを 1 つ選択し、データ モデル全体でそれを使用します。Ordinarily you would choose one pattern and use it throughout your data model. ここのバリエーションから、いずれのパターンも利用できることがわかります。Here, the variation illustrates that you can use either pattern. 後のチュートリアルでは、クラス名なしの ID を利用し、データ モデルに継承を簡単に実装する方法を学習します。In a later tutorial, you'll see how using ID without classname makes it easier to implement inheritance in the data model.

Grade プロパティは enum です。The Grade property is an enum. 型宣言 Grade の後の疑問符は、Grade プロパティが null 許容であることを示します。The question mark after the Grade type declaration indicates that the Grade property is nullable. null という成績は 0 点とは異なります。null は点数がわからないことか、まだ採点されていないことを意味します。A grade that's null is different from a zero grade -- null means a grade isn't known or hasn't been assigned yet.

StudentID プロパティは外部キーです。それに対応するナビゲーション プロパティは Student です。The StudentID property is a foreign key, and the corresponding navigation property is Student. Enrollment エンティティは 1 つの Student エンティティに関連付けられており、1 つの Student エンティティだけを保持できます (先に見た、複数の Enrollment エンティティを保持できる Student.Enrollments ナビゲーション プロパティとは異なります)。An Enrollment entity is associated with one Student entity, so the property can only hold a single Student entity (unlike the Student.Enrollments navigation property you saw earlier, which can hold multiple Enrollment entities).

CourseID プロパティは外部キーです。それに対応するナビゲーション プロパティは Course です。The CourseID property is a foreign key, and the corresponding navigation property is Course. Enrollment エンティティは 1 つの Course エンティティに関連付けられます。An Enrollment entity is associated with one Course entity.

Entity Framework は <navigation property name><primary key property name> という名前が付いている場合、プロパティを外部キー プロパティとして解釈します。たとえば、Student ナビゲーション プロパティの StudentID です。Student エンティティの主キーが ID であるためです。Entity Framework interprets a property as a foreign key property if it's named <navigation property name><primary key property name> (for example, StudentID for the Student navigation property since the Student entity's primary key is ID). 外部キーにも <primary key property name> という単純な名前を付けることができます。たとえば、CourseID です。Course エンティティの主キーが CourseID であるためです。Foreign key properties can also be named simply <primary key property name> (for example, CourseID since the Course entity's primary key is CourseID).

Course エンティティThe Course entity

Course エンティティの図

[Models] フォルダーで、Course.cs を作成し、既存のコードを次のコードに変更します。In the Models folder, create Course.cs and replace the existing code with the following code:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;

namespace ContosoUniversity.Models
{
    public class Course
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CourseID { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }
    }
}

Enrollments プロパティはナビゲーション プロパティです。The Enrollments property is a navigation property. 1 つの Course エンティティにたくさんの Enrollment エンティティを関連付けることができます。A Course entity can be related to any number of Enrollment entities.

DatabaseGenerated 属性については、このシリーズの後のチュートリアルで詳しく学習します。We'll say more about the DatabaseGenerated attribute in a later tutorial in this series. 基本的に、この属性によって、講座の主キーをデータベースに生成させず、自分で入力できるようになります。Basically, this attribute lets you enter the primary key for the course rather than having the database generate it.

データベース コンテキストの作成Create the Database Context

所与のデータ モデルの Entity Framework 機能を調整するメイン クラスは、データベース コンテキスト クラスです。The main class that coordinates Entity Framework functionality for a given data model is the database context class. このクラスは、Microsoft.EntityFrameworkCore.DbContext クラスから派生させて作成します。You create this class by deriving from the Microsoft.EntityFrameworkCore.DbContext class. 自分のコードでは、データ モデルに含めるエンティティを自分で指定します。In your code you specify which entities are included in the data model. Entity Framework の特定の動作をカスタマイズすることもできます。You can also customize certain Entity Framework behavior. このプロジェクトでは、クラスに SchoolContext という名前が付けられています。In this project, the class is named SchoolContext.

プロジェクト フォルダーで、Data という名前のフォルダーを作成します。In the project folder, create a folder named Data.

[Data] フォルダーで、SchoolContext.cs という名前の新しいクラス ファイルを作成し、テンプレート コードを次のコードに変更します。In the Data folder create a new class file named SchoolContext.cs, and replace the template code with the following code:

using ContosoUniversity.Models;
using Microsoft.EntityFrameworkCore;

namespace ContosoUniversity.Data
{
    public class SchoolContext : DbContext
    {
        public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
        {
        }

        public DbSet<Course> Courses { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Student> Students { get; set; }
    }
}

このコードによって、エンティティ セットごとに DbSet プロパティが作成されます。This code creates a DbSet property for each entity set. Entity Framework の用語では、エンティティ セットは通常はデータベース テーブルに対応し、エンティティはテーブルの行に対応します。In Entity Framework terminology, an entity set typically corresponds to a database table, and an entity corresponds to a row in the table.

DbSet<Enrollment> ステートメントと DbSet<Course> ステートメントは省略しても同じ動作をします。You could've omitted the DbSet<Enrollment> and DbSet<Course> statements and it would work the same. Entity Framework にはそれらが暗黙的に含まれることがあります。Student エンティティが Enrollment エンティティを参照し、Enrollment エンティティが Course エンティティを参照するためです。The Entity Framework would include them implicitly because the Student entity references the Enrollment entity and the Enrollment entity references the Course entity.

データベースが作成されると、EF によって、DbSet プロパティと同じ名前を持つテーブルが作成されます。When the database is created, EF creates tables that have names the same as the DbSet property names. 一般的にコレクションのプロパティ名は複数形 (Student ではなく、Students) ですが、テーブル名を複数にするかどうかについては、開発者の間で意見が分かれています。Property names for collections are typically plural (Students rather than Student), but developers disagree about whether table names should be pluralized or not. このチュートリアル シリーズでは、DbContext に単数のテーブル名を指定して既定の動作をオーバーライドします。For these tutorials you'll override the default behavior by specifying singular table names in the DbContext. そのために、最後の DbSet プロパティの後に、次の強調表示されているコードを追加します。To do that, add the following highlighted code after the last DbSet property.

using ContosoUniversity.Models;
using Microsoft.EntityFrameworkCore;

namespace ContosoUniversity.Data
{
    public class SchoolContext : DbContext
    {
        public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
        {
        }

        public DbSet<Course> Courses { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Student> Students { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Course>().ToTable("Course");
            modelBuilder.Entity<Enrollment>().ToTable("Enrollment");
            modelBuilder.Entity<Student>().ToTable("Student");
        }
    }
}

依存関係の挿入にコンテキストを登録するRegister the context with dependency injection

ASP.NET Core は既定で依存関係の挿入を実装します。ASP.NET Core implements dependency injection by default. サービス (EF データベース コンテキストなど) は、アプリケーションの起動時に依存関係の挿入に登録されます。Services (such as the EF database context) are registered with dependency injection during application startup. これらのサービス (MVC コント ローラーなど) を必要とするコンポーネントには、コンストラクターのパラメーターを介してこれらのサービスが指定されます。Components that require these services (such as MVC controllers) are provided these services via constructor parameters. このチュートリアルの後半で、コンテキスト インスタンスを取得するコントローラー コンストラクター コードが登場します。You'll see the controller constructor code that gets a context instance later in this tutorial.

SchoolContext をサービスとして登録するには、Startup.cs を開き、強調表示されている行を ConfigureServices メソッドに追加します。To register SchoolContext as a service, open Startup.cs, and add the highlighted lines to the ConfigureServices method.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<SchoolContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddMvc();
}

DbContextOptionsBuilder オブジェクトでメソッドが呼び出され、接続文字列の名前がコンテキストに渡されます。The name of the connection string is passed in to the context by calling a method on a DbContextOptionsBuilder object. ローカル開発の場合、ASP.NET Core 構成システムappsettings.json ファイルから接続文字列を読み取ります。For local development, the ASP.NET Core configuration system reads the connection string from the appsettings.json file.

名前空間の ContosoUniversity.DataMicrosoft.EntityFrameworkCore に対して using ステートメントを追加し、プロジェクトをビルドします。Add using statements for ContosoUniversity.Data and Microsoft.EntityFrameworkCore namespaces, and then build the project.

using ContosoUniversity.Data;
using Microsoft.EntityFrameworkCore;

appsettings.json ファイルを開き、次のサンプルのように接続文字列を追加します。Open the appsettings.json file and add a connection string as shown in the following example.

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

SQL Server Express LocalDBSQL Server Express LocalDB

この接続文字列によって SQL Server LocalDB データベースが指定されます。The connection string specifies a SQL Server LocalDB database. LocalDB は SQL Server Express データベース エンジンの軽量版であり、実稼働ではなく、アプリケーションの開発を意図して設計されています。LocalDB is a lightweight version of the SQL Server Express Database Engine and is intended for application development, not production use. LocalDB は要求時に開始され、ユーザー モードで実行されるため、複雑な構成はありません。LocalDB starts on demand and runs in user mode, so there's no complex configuration. 既定では、LocalDB は C:/Users/<user> ディレクトリに .mdf データベース ファイルを作成します。By default, LocalDB creates .mdf database files in the C:/Users/<user> directory.

テスト データでデータベースを初期化するコードを追加するAdd code to initialize the database with test data

Entity Framework によって空のデータベースが自動的に作成されます。The Entity Framework will create an empty database for you. このセクションでは、テスト データを入力する目的で、データベースの作成後に呼び出されるメソッドを記述します。In this section, you write a method that's called after the database is created in order to populate it with test data.

ここでは、データベースを自動的に作成する EnsureCreated メソッドを使用します。Here you'll use the EnsureCreated method to automatically create the database. 後のチュートリアルでは、モデル変更の処理方法について学習します。データベースを削除し、再作成するのではなく、Code First Migrations を利用してデータベース スキーマを変更します。In a later tutorial you'll see how to handle model changes by using Code First Migrations to change the database schema instead of dropping and re-creating the database.

[データ] フォルダーで DbInitializer.cs という名前の新しいクラス ファイルを作成し、テンプレート コードを次のコードに変更します。このコードにより、必要なときにデータベースが作成され、新しいデータベースにテスト データが読み込まれます。In the Data folder, create a new class file named DbInitializer.cs and replace the template code with the following code, which causes a database to be created when needed and loads test data into the new database.

using ContosoUniversity.Models;
using System;
using System.Linq;

namespace ContosoUniversity.Data
{
    public static class DbInitializer
    {
        public static void Initialize(SchoolContext context)
        {
            context.Database.EnsureCreated();

            // Look for any students.
            if (context.Students.Any())
            {
                return;   // DB has been seeded
            }

            var students = new Student[]
            {
            new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")},
            new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2002-09-01")},
            new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2003-09-01")},
            new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2002-09-01")},
            new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002-09-01")},
            new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2001-09-01")},
            new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2003-09-01")},
            new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2005-09-01")}
            };
            foreach (Student s in students)
            {
                context.Students.Add(s);
            }
            context.SaveChanges();

            var courses = new Course[]
            {
            new Course{CourseID=1050,Title="Chemistry",Credits=3},
            new Course{CourseID=4022,Title="Microeconomics",Credits=3},
            new Course{CourseID=4041,Title="Macroeconomics",Credits=3},
            new Course{CourseID=1045,Title="Calculus",Credits=4},
            new Course{CourseID=3141,Title="Trigonometry",Credits=4},
            new Course{CourseID=2021,Title="Composition",Credits=3},
            new Course{CourseID=2042,Title="Literature",Credits=4}
            };
            foreach (Course c in courses)
            {
                context.Courses.Add(c);
            }
            context.SaveChanges();

            var enrollments = new Enrollment[]
            {
            new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A},
            new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C},
            new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B},
            new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B},
            new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F},
            new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F},
            new Enrollment{StudentID=3,CourseID=1050},
            new Enrollment{StudentID=4,CourseID=1050},
            new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F},
            new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C},
            new Enrollment{StudentID=6,CourseID=1045},
            new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A},
            };
            foreach (Enrollment e in enrollments)
            {
                context.Enrollments.Add(e);
            }
            context.SaveChanges();
        }
    }
}

このコードはデータベースに学生が存在するかどうかを確認し、存在しない場合、そのデータベースは新しく、テスト データを入力する必要があると見なします。The code checks if there are any students in the database, and if not, it assumes the database is new and needs to be seeded with test data. List<T> コレクションではなく配列にテスト データを読み込み、パフォーマンスを最適化します。It loads test data into arrays rather than List<T> collections to optimize performance.

Program.cs で、アプリケーションの起動時に次を実行するように Main メソッドを変更します。In Program.cs, modify the Main method to do the following on application startup:

  • 依存関係挿入コンテナーからデータベース コンテキスト インスタンスを取得します。Get a database context instance from the dependency injection container.
  • seed メソッドを呼び出し、コンテキストを渡します。Call the seed method, passing to it the context.
  • seed メソッドが完了したら、コンテキストを破棄します。Dispose the context when the seed method is done.
public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<SchoolContext>();
            DbInitializer.Initialize(context);
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}

using ステートメントを追加します。Add using statements:

using Microsoft.Extensions.DependencyInjection;
using ContosoUniversity.Data;

以前のチュートリアルでは、Startup.csConfigure メソッドと同様のコードを確認できるかもしれません。In older tutorials, you may see similar code in the Configure method in Startup.cs. 要求パイプラインを設定する目的でのみ Configure メソッドを利用することをお勧めします。We recommend that you use the Configure method only to set up the request pipeline. アプリケーションの起動コードは、Main メソッドに属します。Application startup code belongs in the Main method.

これからアプリケーションを初めて実行します。データベースが作成され、テスト データが入力されます。Now the first time you run the application, the database will be created and seeded with test data. データ モデルを変更するたびに、データベースを削除し、seed メソッドを更新し、新しいデータベースで同様にやり直すことができます。Whenever you change your data model, you can delete the database, update your seed method, and start afresh with a new database the same way. 後のチュートリアルでは、データ モデルが変わったとき、データベースを削除して作り直すのではなく、修正する方法について学習します。In later tutorials, you'll see how to modify the database when the data model changes, without deleting and re-creating it.

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

次に、Visual Studio のスキャフォールディング エンジンを利用し、MVC のコントローラーとビューを追加します。このコントローラーとビューでは、EF を利用してクエリを実行し、データを保存します。Next, you'll use the scaffolding engine in Visual Studio to add an MVC controller and views that will use EF to query and save data.

CRUD アクションのメソッドとビューの自動作成は、スキャフォールディングと言います。The automatic creation of CRUD action methods and views is known as scaffolding. 一般的には生成されたコードは修正しないのに対し、スキャフォールディングされたコードを開始点として独自の要件に合うように変更できるという点で、スキャフォールディングはコード生成と異なります。Scaffolding differs from code generation in that the scaffolded code is a starting point that you can modify to suit your own requirements, whereas you typically don't modify generated code. 生成されたコードをカスタマイズする必要があるとき、部分クラスを利用するか、状況が変わったときにコードを再生成します。When you need to customize generated code, you use partial classes or you regenerate the code when things change.

  • ソリューション エクスプローラーControllers フォルダーを右クリックし、[追加]、[スキャフォールディングされた新しい項目] の順に選択します。Right-click the Controllers folder in Solution Explorer and select Add > New Scaffolded Item.

[MVC 依存関係の追加] ダイアログ ボックスが表示された場合は、次のようにします。If the Add MVC Dependencies dialog appears:

  • Visual Studio を最新バージョンに更新しますUpdate Visual Studio to the latest version. 15.5 より前のバージョンの Visual Studio の場合はこのダイアログが表示されます。Visual Studio versions prior to 15.5 show this dialog.

  • 更新できない場合は、[追加] を選択してから、もう一度コントローラーの追加手順に従ってください。If you can't update, select ADD, and then follow the add controller steps again.

  • [スキャフォールディングを追加] ダイアログ ボックスで:In the Add Scaffold dialog box:

    • [Entity Framework を使用したビューがある MVC コントローラー] を選択します。Select MVC controller with views, using Entity Framework.

    • [追加] をクリックします。Click Add.

  • [コントローラーの追加] ダイアログ ボックスで:In the Add Controller dialog box:

    • [モデル クラス][Student] を選択します。In Model class select Student.

    • [データ コンテキスト クラス][SchoolContext] を選択します。In Data context class select SchoolContext.

    • 名前は StudentsController をそのまま選択します。Accept the default StudentsController as the name.

    • [追加] をクリックします。Click Add.

    Student のスキャフォールディング

    [追加] をクリックすると、Visual Studio スキャフォールディング エンジンは StudentsController.cs ファイルと、コントローラーと連動する一連のビュー (.cshtml ファイル) を作成します。When you click Add, the Visual Studio scaffolding engine creates a StudentsController.cs file and a set of views (.cshtml files) that work with the controller.

(スキャフォールディング エンジンは、このチュートリアルで先に行ったように手動で最初に作成しない場合、データベース コンテキストを自動作成することもできます。(The scaffolding engine can also create the database context for you if you don't create it manually first as you did earlier for this tutorial. [コントローラーの追加] ボックスで新しいコンテキスト クラスを指定できます。[データ コンテキスト クラス] の右にあるプラス記号をクリックします。You can specify a new context class in the Add Controller box by clicking the plus sign to the right of Data context class. Visual Studio はコントローラーやビューと共に DbContext クラスを作成します。)Visual Studio will then create your DbContext class as well as the controller and views.)

コントローラーがコンストラクター パラメーターとして SchoolContext を受け取ることがわかります。You'll notice that the controller takes a SchoolContext as a constructor parameter.

namespace ContosoUniversity.Controllers
{
    public class StudentsController : Controller
    {
        private readonly SchoolContext _context;

        public StudentsController(SchoolContext context)
        {
            _context = context;
        }

ASP.NET 依存関係挿入では、SchoolContext のインスタンスがコントローラーに渡されます。ASP.NET dependency injection will take care of passing an instance of SchoolContext into the controller. それは先に Startup.cs ファイルで構成しました。You configured that in the Startup.cs file earlier.

コントローラーには Index アクション メソッドが含まれます。これはデータベースにあるすべての学生を表示します。The controller contains an Index action method, which displays all students in the database. このメソッドはデータベース コンテキスト インスタンスの Students プロパティを読み取り、Students エンティティ セットから学生の一覧を取得します。The method gets a list of students from the Students entity set by reading the Students property of the database context instance:

public async Task<IActionResult> Index()
{
    return View(await _context.Students.ToListAsync());
}

チュートリアルの後半で、このコードの非同期プログラミング要素について学習します。You'll learn about the asynchronous programming elements in this code later in the tutorial.

Views/Students/Index.cshtml ビューには、この一覧で表形式で表示されます。The Views/Students/Index.cshtml view displays this list in a table:

@model IEnumerable<ContosoUniversity.Models.Student>

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
                <th>
                    @Html.DisplayNameFor(model => model.LastName)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.FirstMidName)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.EnrollmentDate)
                </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstMidName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EnrollmentDate)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.ID">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.ID">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.ID">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

CTRL を押しながら F5 を押してプロジェクトを実行するか、メニューで [デバッグ]、[デバッグなしで開始] の順に選択します。Press CTRL+F5 to run the project or choose Debug > Start Without Debugging from the menu.

[Students] タブをクリックすると、DbInitializer.Initialize メソッドによって挿入されたテスト データが表示されます。Click the Students tab to see the test data that the DbInitializer.Initialize method inserted. ブラウザーのウィンドウ幅によって決まることですが、Student タブ リンクはページの一番上に表示されるか、右上隅のナビゲーション アイコンをクリックしないと表示されません。Depending on how narrow your browser window is, you'll see the Student tab link at the top of the page or you'll have to click the navigation icon in the upper right corner to see the link.

Contoso University のホーム ページ (ウィンドウ幅が狭いとき)

Students インデックス ページ

データベースを表示するView the Database

アプリケーションを起動する葉、DbInitializer.Initialize メソッドが EnsureCreated を呼び出します。When you started the application, the DbInitializer.Initialize method calls EnsureCreated. EF はデータベースがないことを認識し、作成します。Initialize メソッド コードの残りの部分により、データベースにデータが入力されます。EF saw that there was no database and so it created one, then the remainder of the Initialize method code populated the database with data. SQL Server Object Explorer (SSOX) を利用し、Visual Studio でデータベースを表示できます。You can use SQL Server Object Explorer (SSOX) to view the database in Visual Studio.

ブラウザーを閉じます。Close the browser.

SSOX ウィンドウがまだ開いていない場合、Visual Studio の [表示] メニューから選択します。If the SSOX window isn't already open, select it from the View menu in Visual Studio.

SSOX で (localdb)\MSSQLLocalDB > Databases をクリックし、appsettings.json ファイルの接続文字列にあるデータベース名のエントリをクリックします。In SSOX, click (localdb)\MSSQLLocalDB > Databases, and then click the entry for the database name that's in the connection string in your appsettings.json file.

[テーブル] ノードを展開し、データベースのテーブルを表示します。Expand the Tables node to see the tables in your database.

SSOX のテーブル

[Student] テーブルを右クリックし、[データの表示] をクリックすると、作成された列とテーブルに挿入された行が表示されます。Right-click the Student table and click View Data to see the columns that were created and the rows that were inserted into the table.

SSOX の Student テーブル

.mdf データベース ファイルと .ldf データベース ファイルは C:\Users\ フォルダーにあります。The .mdf and .ldf database files are in the C:\Users\ folder.

アプリの起動時に実行される初期化子メソッドで EnsureCreated を呼び出すため、Student クラスを変更し、データベースを削除し、アプリケーションを再実行できます。変更に合わせてデータベースが自動的に再作成されます。Because you're calling EnsureCreated in the initializer method that runs on app start, you could now make a change to the Student class, delete the database, run the application again, and the database would automatically be re-created to match your change. たとえば、Student クラスに EmailAddress プロパティを追加する場合、再作成されたテーブルに新しい EmailAddress 列が表示されます。For example, if you add an EmailAddress property to the Student class, you'll see a new EmailAddress column in the re-created table.

規約Conventions

規約を利用することや Entity Framework が想定を行うことにより、Entity Framework が完全なデータベースを自動作成するために記述しなければならないコードの量が最小限に抑えられます。The amount of code you had to write in order for the Entity Framework to be able to create a complete database for you is minimal because of the use of conventions, or assumptions that the Entity Framework makes.

  • DbSet プロパティの名前がテーブル名として使用されます。The names of DbSet properties are used as table names. DbSet プロパティによって参照されないエンティティについては、エンティティ クラス名がテーブル名として使用されます。For entities not referenced by a DbSet property, entity class names are used as table names.

  • 列名には、エンティティ プロパティ名が使用されます。Entity property names are used for column names.

  • ID または classnameID という名前が付けられているエンティティ プロパティは主キーのプロパティとして認識されます。Entity properties that are named ID or classnameID are recognized as primary key properties.

  • という名前が付いている場合、プロパティは外部キー プロパティとして解釈されます。たとえば、Student ナビゲーション プロパティの StudentID です。Student エンティティの主キーが ID であるためです。A property is interpreted as a foreign key property if it's named (for example, StudentID for the Student navigation property since the Student entity's primary key is ID). 外部キーにも という単純な名前を付けることができます。たとえば、EnrollmentID です。Enrollment エンティティの主キーが EnrollmentID であるためです。Foreign key properties can also be named simply (for example, EnrollmentID since the Enrollment entity's primary key is EnrollmentID).

従来の動作をオーバーライドできます。Conventional behavior can be overridden. たとえば、このチュートリアルで先に見たように、テーブル名を明示的に指定できます。For example, you can explicitly specify table names, as you saw earlier in this tutorial. また、列名を設定し、任意のプロパティを主キーまたは外部キーとして設定できます。これについては、このシリーズの後のチュートリアルで学習します。And you can set column names and set any property as primary key or foreign key, as you'll see in a later tutorial in this series.

非同期コードAsynchronous code

ASP.NET Core と EF Core では、非同期プログラミングが既定のモードです。Asynchronous programming is the default mode for ASP.NET Core and EF Core.

Web サーバーでは、利用できるスレッド数に限りがあります。負荷が高い状況では、利用できるスレッドが全部使われる可能性があります。A web server has a limited number of threads available, and in high load situations all of the available threads might be in use. その場合、スレッドが解放されるまでサーバーは新しい要求を処理できません。When that happens, the server can't process new requests until the threads are freed up. 同期コードの場合、たくさんのスレッドが関連付けられていても、I/O の完了を待っているため、実際には何の作業も行っていないということがあります。With synchronous code, many threads may be tied up while they aren't actually doing any work because they're waiting for I/O to complete. 非同期コードの場合、あるプロセスが I/O の完了を待っているとき、多の要求の処理にサーバーが利用できるようにそのスレッドが解放されます。With asynchronous code, when a process is waiting for I/O to complete, its thread is freed up for the server to use for processing other requests. 結果として、非同期コードの場合、サーバー リソースをより効率的に利用できます。サーバーは、より多くのトラフィックを遅延なく処理できます。As a result, asynchronous code enables server resources to be used more efficiently, and the server is enabled to handle more traffic without delays.

非同期コードは実行時に少量のオーバーヘッドを発生させるが、トラフィックが少ない場合、パフォーマンスに与える影響は無視して構わない程度です。トラフィックが多い場合、相当なパフォーマンス改善が見込まれます。Asynchronous code does introduce a small amount of overhead at run time, but for low traffic situations the performance hit is negligible, while for high traffic situations, the potential performance improvement is substantial.

次のコードでは、キーワード async、戻り値 Task<T>、キーワード await、メソッド ToListAsync によりコードの実行が非同期になります。In the following code, the async keyword, Task<T> return value, await keyword, and ToListAsync method make the code execute asynchronously.

public async Task<IActionResult> Index()
{
    return View(await _context.Students.ToListAsync());
}
  • キーワード async は、メソッド本文の一部にコールバックを生成し、返された Task<IActionResult> オブジェクトを自動作成するようにコンパイラに伝えます。The async keyword tells the compiler to generate callbacks for parts of the method body and to automatically create the Task<IActionResult> object that's returned.

  • 戻り値の型 Task<IActionResult> は、進行中の作業と型 IActionResult の結果を表します。The return type Task<IActionResult> represents ongoing work with a result of type IActionResult.

  • キーワード await により、コンパイラはメソッドを 2 つに分割します。The await keyword causes the compiler to split the method into two parts. 最初の部分は、非同期で開始される操作で終わります。The first part ends with the operation that's started asynchronously. 2 つ目の部分は、操作の完了時に呼び出されるコールバック メソッドに入ります。The second part is put into a callback method that's called when the operation completes.

  • ToListAsync は、ToList 拡張メソッドの非同期バージョンです。ToListAsync is the asynchronous version of the ToList extension method.

Entity Framework を利用する非同期コードの記述で注意すべき点:Some things to be aware of when you are writing asynchronous code that uses the Entity Framework:

  • クエリやコマンドをデータベースに送信するステートメントのみが非同期で実行されます。Only statements that cause queries or commands to be sent to the database are executed asynchronously. たとえば、ToListAsyncSingleOrDefaultAsyncSaveChangesAsync などです。That includes, for example, ToListAsync, SingleOrDefaultAsync, and SaveChangesAsync. var students = context.Students.Where(s => s.LastName == "Davolio") など、IQueryable を変更するだけのステートメントは含まれません。It doesn't include, for example, statements that just change an IQueryable, such as var students = context.Students.Where(s => s.LastName == "Davolio").

  • EF コンテキストはスレッド セーフではありません。複数の操作を並列実行しないでください。An EF context isn't thread safe: don't try to do multiple operations in parallel. 非同期 EF メソッドを呼び出すとき、await キーワードを常に使用します。When you call any async EF method, always use the await keyword.

  • 非同期コードのパフォーマンス上の利点を最大限に活用する場合、(ページングなどのために) ライブラリ パッケージを利用しているのであれば、それがクエリをデータベースに送信させる Entity Framework メソッドを呼び出す場合、非同期を利用する必要があります。If you want to take advantage of the performance benefits of async code, make sure that any library packages that you're using (such as for paging), also use async if they call any Entity Framework methods that cause queries to be sent to the database.

.NET の非同期プログラミングについては、「非同期の概要」を参照してください。For more information about asynchronous programming in .NET, see Async Overview.

まとめSummary

これで Entity Framework Core と SQL Server Express LocalDB を利用してデータを保存し、表示する単純なアプリケーションが作成されました。You've now created a simple application that uses the Entity Framework Core and SQL Server Express LocalDB to store and display data. 次のチュートリアルでは、基本的な CRUD (作成、読み取り、更新、削除) 操作を実行する方法について学習します。In the following tutorial, you'll learn how to perform basic CRUD (create, read, update, delete) operations.