パート 2: ASP.NET Core で Razor ページ アプリにモデルを追加する

Note

これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

重要

この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

このチュートリアルでは、データベースの映画を管理するためのクラスが追加されます。 アプリのモデル クラスでは、Entity Framework Core (EF Core) を使用して、データベースを操作します。 EF Core は、データ アクセスを簡略化するオブジェクト リレーショナル マッパー (O/RM) です。 モデル クラスを記述すると、EF Core によってデータベースが作成されます。

モデル クラスは EF Core に対する依存関係がないため、Plain-Old CLR Objects (単純な従来の CLR) の頭文字を取って POCO クラスと呼ばれます。 これらは、データベースに格納されるデータのプロパティを定義します。

データ モデルの追加

  1. ソリューション エクスプローラーで、RazorPagesMovie プロジェクトを右クリックし、[追加]>[新しいフォルダー] の順に選択します。 フォルダーに「 Modelsで行うことができます。

  2. Models フォルダーを右クリックしします。 [追加]>[クラス] の順に選択します。 クラスに Movie と名前を付けます。

  3. Movie クラスに次のプロパティを追加します。

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Movie クラスには次が含まれます。

  • ID フィールドは、データベースで主キー用に必要です。

  • ReleaseDate プロパティのデータの型を指定する [DataType] 属性。 この属性を使用する場合:

    • ユーザーは日付フィールドに時刻の情報を入力する必要はありません。
    • 日付のみが表示され、時刻の情報は表示されません。
  • string の後の疑問符は、そのプロパティが Null 許容であることを示します。 詳細については、「null 許容参照型」を参照してください。

DataAnnotations は、後のチュートリアルで説明されます。

プロジェクトをビルドして、コンパイル エラーがないことを確認します。

ムービー モデルのスキャフォールディング

このセクションでは、ムービー モデルがスキャフォールディングされます。 つまり、スキャフォールディング ツールにより、ムービー モデルの作成、読み取り、更新、削除の (CRUD) 操作用のページが生成されます。

  1. Pages/Movies フォルダーを作成します。

    1. Pages フォルダーを右クリックし、[追加]>[新しいフォルダー] の順に選択します。
    2. フォルダーに Movies という名前を付けます。
  2. Pages/Movies フォルダーを右クリックし、[追加]>[新規スキャフォールディング アイテム] の順に選択します。

    新規スキャフォールディング アイテム

  3. [新しいスキャフォールディングの追加] ダイアログで、[Entity Framework を使用する Razor Pages (CRUD)]>[追加] の順に選択します。

    スキャフォールディングを追加

  4. [Add Razor Pages using Entity Framework (CRUD)](Entity Framework を使用して Razor Pages (CRUD) を追加する) ダイアログを完了します。

    1. [モデル クラス] ドロップ ダウンで、 [Movie (RazorPagesMovie.Models)] を選択します。
    2. Data context class 行で、 + (+) 記号を選択します。
      1. [データ コンテキストの追加] ダイアログで、クラス名 RazorPagesMovie.Data.RazorPagesMovieContext が生成されます。
      2. [データベース プロバイダー] ドロップダウンで、[SQL Server] を選びます。
    3. [追加] を選択します。

    Razor Pages の追加

appsettings.json ファイルは、ローカル データベースへの接続に使用される接続文字列を使用して更新されます。

作成および更新されたファイル

スキャフォールディングのプロセスでは、次のファイルが作成されます。

  • Pages/Movies: 作成、削除、詳細、編集、インデックス。
  • Data/RazorPagesMovieContext.cs

作成されたファイルについては、次のチュートリアルで説明します。

スキャフォールディング プロセスにより、次の強調されているコードが Program.cs ファイルに追加されます。

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Program.cs の変更については、このチュートリアルで後ほど説明します。

EF の移行機能を使用して初期データベース スキーマを作成する

Entity Framework Core の移行機能を使用すると、次のことができます。

  • 初期データベース スキーマを作成します。
  • データベース スキーマを増分方式で更新して、アプリのデータ モデルとの同期を維持します。 データベース内の既存のデータは保持されます。

このセクションでは、パッケージ マネージャー コンソール (PMC) ウィンドウを使用して、次の作業を行います。

  • 初期移行を追加します。
  • 初期移行でデータベースを更新します。
  1. [ツール] メニューで、[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

    PMC メニュー

  2. PMC で、次のコマンドを入力します。

    Add-Migration InitialCreate
    Update-Database
    
  • Add-Migration コマンドによって最初のデータベース スキーマを作成するコードが生成されます。 このスキーマは、DbContext で指定されたモデルに基づきます。 InitialCreate 引数は、移行の名前を指定するために使用されます。 任意の名前を使用できますが、規則により、移行を説明する名前が選択されます。

  • Update-Database コマンドにより、適用されていない移行で Up メソッドが実行されます。 ここでは、コマンドにより、Migrations/<time-stamp>_InitialCreate.cs ファイルの Up メソッドが実行され、データベースが作成されます。

次の警告が表示されますが、これは後の手順で対処します。

エンティティ型 'Movie' の decimal 列 'Price' に型が指定されていません。 これにより、値が既定の有効桁数と小数点以下桁数に収まらない場合、自動的に切り捨てられます。 'HasColumnType()' を使用してすべての値に適合する SQL server 列の型を明示的に指定します。

データ コンテキスト RazorPagesMovieContext:

  • Microsoft.EntityFrameworkCore.DbContext から派生します。
  • データ モデルに含まれるエンティティを指定します。
  • Movie モデルに関する EF Core の機能 (作成、読み取り、更新、削除など) を調整します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

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

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

上記のコードによって、エンティティ セットの DbSet<Movie> プロパティが作成されます。 Entity Framework の用語では、エンティティ セットは通常はデータベース テーブルに対応します。 エンティティはテーブル内の行に対応します。

DbContextOptions オブジェクトでメソッドが呼び出され、接続文字列の名前がコンテキストに渡されます。 ローカル開発の場合、構成システムによって、appsettings.json ファイルから接続文字列が読み取られます。

アプリのテスト

  1. アプリを実行し、ブラウザーで URL に /Movies を追加します ( http://localhost:port/movies )。

    次のエラー メッセージが表示される場合:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    移行手順を失敗しました。

  2. [Create New] (新規作成) リンクをテストします。

    [作成] ページ

    Note

    Price フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使う英語以外のロケール、および英語 (米国) 以外の日付形式で、jQuery 検証をサポートするには、アプリをグローバル化する必要があります。 グローバル化の手順については、この GitHub の記事をご覧ください。

  3. [編集][詳細] 、および [削除] の各リンクをテストします。

次のチュートリアルでは、スキャフォールディングによって作成されるファイルについて説明します。

依存関係挿入に登録されるコンテキストを調べる

ASP.NET Core には、依存関係挿入が組み込まれています。 サービス (EF Core データベース コンテキストなど) は、アプリケーションの起動時に依存関係の挿入に登録されます。 これらのサービスを必要とするコンポーネント (Razor Pages など) は、コンストラクターのパラメーターを介して指定されます。 データベース コンテキスト インスタンスを取得するコンストラクター コードは、この後のチュートリアルで示します。

スキャフォールディング ツールによってデータベース コンテキストが自動的に作成され、依存関係挿入コンテナーに登録されました。 スキャフォールダーにより、次の強調されているコードが Program.cs ファイルに追加されます。

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

完成したサンプルを使用したトラブルシューティング

解決できない問題が発生した場合は、コードを完成したプロジェクトと比較します。 完成したプロジェクトを表示またはダウンロードします (ダウンロード方法)。

次の手順

このチュートリアルでは、データベースの映画を管理するためのクラスが追加されます。 アプリのモデル クラスでは、Entity Framework Core (EF Core) を使用して、データベースを操作します。 EF Core は、データ アクセスを簡略化するオブジェクト リレーショナル マッパー (O/RM) です。 モデル クラスを記述すると、EF Core によってデータベースが作成されます。

モデル クラスは EF Core に対する依存関係がないため、Plain-Old CLR Objects (単純な従来の CLR) の頭文字を取って POCO クラスと呼ばれます。 これらは、データベースに格納されるデータのプロパティを定義します。

データ モデルの追加

  1. ソリューション エクスプローラーで、RazorPagesMovie プロジェクトを右クリックし、[追加]>[新しいフォルダー] の順に選択します。 フォルダーに「 Modelsで行うことができます。

  2. Models フォルダーを右クリックしします。 [追加]>[クラス] の順に選択します。 クラスに Movie と名前を付けます。

  3. Movie クラスに次のプロパティを追加します。

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Movie クラスには次が含まれます。

  • ID フィールドは、データベースで主キー用に必要です。

  • ReleaseDate プロパティのデータの型を指定する [DataType] 属性。 この属性を使用する場合:

    • ユーザーは日付フィールドに時刻の情報を入力する必要はありません。
    • 日付のみが表示され、時刻の情報は表示されません。
  • string の後の疑問符は、そのプロパティが Null 許容であることを示します。 詳細については、「null 許容参照型」を参照してください。

DataAnnotations は、後のチュートリアルで説明されます。

プロジェクトをビルドして、コンパイル エラーがないことを確認します。

ムービー モデルのスキャフォールディング

このセクションでは、ムービー モデルがスキャフォールディングされます。 つまり、スキャフォールディング ツールにより、ムービー モデルの作成、読み取り、更新、削除の (CRUD) 操作用のページが生成されます。

  1. Pages/Movies フォルダーを作成します。

    1. Pages フォルダーを右クリックし、[追加]>[新しいフォルダー] の順に選択します。
    2. フォルダーに Movies という名前を付けます。
  2. Pages/Movies フォルダーを右クリックし、[追加]>[新規スキャフォールディング アイテム] の順に選択します。

    新規スキャフォールディング アイテム

  3. [新しいスキャフォールディングの追加] ダイアログで、[Entity Framework を使用する Razor Pages (CRUD)]>[追加] の順に選択します。

    スキャフォールディングを追加

  4. [Add Razor Pages using Entity Framework (CRUD)](Entity Framework を使用して Razor Pages (CRUD) を追加する) ダイアログを完了します。

    1. [モデル クラス] ドロップ ダウンで、 [Movie (RazorPagesMovie.Models)] を選択します。
    2. Data context class 行で、 + (+) 記号を選択します。
      1. [データ コンテキストの追加] ダイアログで、クラス名 RazorPagesMovie.Data.RazorPagesMovieContext が生成されます。
      2. [データベース プロバイダー] ドロップダウンで、[SQL Server] を選びます。
    3. [追加] を選択します。

    Razor Pages の追加

appsettings.json ファイルは、ローカル データベースへの接続に使用される接続文字列を使用して更新されます。

作成および更新されたファイル

スキャフォールディングのプロセスでは、次のファイルが作成されます。

  • Pages/Movies: 作成、削除、詳細、編集、インデックス。
  • Data/RazorPagesMovieContext.cs

作成されたファイルについては、次のチュートリアルで説明します。

スキャフォールディング プロセスにより、次の強調されているコードが Program.cs ファイルに追加されます。

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Program.cs の変更については、このチュートリアルで後ほど説明します。

EF の移行機能を使用して初期データベース スキーマを作成する

Entity Framework Core の移行機能を使用すると、次のことができます。

  • 初期データベース スキーマを作成します。
  • データベース スキーマを増分方式で更新して、アプリのデータ モデルとの同期を維持します。 データベース内の既存のデータは保持されます。

このセクションでは、パッケージ マネージャー コンソール (PMC) ウィンドウを使用して、次の作業を行います。

  • 初期移行を追加します。
  • 初期移行でデータベースを更新します。
  1. [ツール] メニューで、[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

    PMC メニュー

  2. PMC で、次のコマンドを入力します。

    Add-Migration InitialCreate
    Update-Database
    
  • Add-Migration コマンドによって最初のデータベース スキーマを作成するコードが生成されます。 このスキーマは、DbContext で指定されたモデルに基づきます。 InitialCreate 引数は、移行の名前を指定するために使用されます。 任意の名前を使用できますが、規則により、移行を説明する名前が選択されます。

  • Update-Database コマンドにより、適用されていない移行で Up メソッドが実行されます。 ここでは、コマンドにより、Migrations/<time-stamp>_InitialCreate.cs ファイルの Up メソッドが実行され、データベースが作成されます。

次の警告が表示されますが、これは後の手順で対処します。

エンティティ型 'Movie' の decimal 列 'Price' に型が指定されていません。 これにより、値が既定の有効桁数と小数点以下桁数に収まらない場合、自動的に切り捨てられます。 'HasColumnType()' を使用してすべての値に適合する SQL server 列の型を明示的に指定します。

データ コンテキスト RazorPagesMovieContext:

  • Microsoft.EntityFrameworkCore.DbContext から派生します。
  • データ モデルに含まれるエンティティを指定します。
  • Movie モデルに関する EF Core の機能 (作成、読み取り、更新、削除など) を調整します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

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

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

上記のコードによって、エンティティ セットの DbSet<Movie> プロパティが作成されます。 Entity Framework の用語では、エンティティ セットは通常はデータベース テーブルに対応します。 エンティティはテーブル内の行に対応します。

DbContextOptions オブジェクトでメソッドが呼び出され、接続文字列の名前がコンテキストに渡されます。 ローカル開発の場合、構成システムによって、appsettings.json ファイルから接続文字列が読み取られます。

アプリのテスト

  1. アプリを実行し、ブラウザーで URL に /Movies を追加します ( http://localhost:port/movies )。

    次のエラー メッセージが表示される場合:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    移行手順を失敗しました。

  2. [Create New] (新規作成) リンクをテストします。

    [作成] ページ

    Note

    Price フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使う英語以外のロケール、および英語 (米国) 以外の日付形式で、jQuery 検証をサポートするには、アプリをグローバル化する必要があります。 グローバル化の手順については、この GitHub の記事をご覧ください。

  3. [編集][詳細] 、および [削除] の各リンクをテストします。

次のチュートリアルでは、スキャフォールディングによって作成されるファイルについて説明します。

依存関係挿入に登録されるコンテキストを調べる

ASP.NET Core には、依存関係挿入が組み込まれています。 サービス (EF Core データベース コンテキストなど) は、アプリケーションの起動時に依存関係の挿入に登録されます。 これらのサービスを必要とするコンポーネント (Razor Pages など) は、コンストラクターのパラメーターを介して指定されます。 データベース コンテキスト インスタンスを取得するコンストラクター コードは、この後のチュートリアルで示します。

スキャフォールディング ツールによってデータベース コンテキストが自動的に作成され、依存関係挿入コンテナーに登録されました。 スキャフォールダーにより、次の強調されているコードが Program.cs ファイルに追加されます。

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

完成したサンプルを使用したトラブルシューティング

解決できない問題が発生した場合は、コードを完成したプロジェクトと比較します。 完成したプロジェクトを表示またはダウンロードします (ダウンロード方法)。

次の手順

このチュートリアルでは、データベースの映画を管理するためのクラスが追加されます。 アプリのモデル クラスでは、Entity Framework Core (EF Core) を使用して、データベースを操作します。 EF Core は、データ アクセスを簡略化するオブジェクト リレーショナル マッパー (O/RM) です。 モデル クラスを記述すると、EF Core によってデータベースが作成されます。

モデル クラスは EF Core に対する依存関係がないため、Plain-Old CLR Objects (単純な従来の CLR) の頭文字を取って POCO クラスと呼ばれます。 これらは、データベースに格納されるデータのプロパティを定義します。

データ モデルの追加

  1. ソリューション エクスプローラーで、RazorPagesMovie プロジェクトを右クリックし、[追加]>[新しいフォルダー] の順に選択します。 フォルダーに「 Modelsで行うことができます。

  2. Models フォルダーを右クリックしします。 [追加]>[クラス] の順に選択します。 クラスに Movie と名前を付けます。

  3. Movie クラスに次のプロパティを追加します。

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; } = string.Empty;
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; } = string.Empty;
            public decimal Price { get; set; }
        }
    }
    

Movie クラスには次が含まれます。

  • ID フィールドは、データベースで主キー用に必要です。

  • ReleaseDate プロパティのデータの型を指定する [DataType] 属性。 この属性を使用する場合:

    • ユーザーは日付フィールドに時刻の情報を入力する必要はありません。
    • 日付のみが表示され、時刻の情報は表示されません。

DataAnnotations は、後のチュートリアルで説明されます。

プロジェクトをビルドして、コンパイル エラーがないことを確認します。

ムービー モデルのスキャフォールディング

このセクションでは、ムービー モデルがスキャフォールディングされます。 つまり、スキャフォールディング ツールにより、ムービー モデルの作成、読み取り、更新、削除の (CRUD) 操作用のページが生成されます。

  1. スキャフォールディング ツールに必要な NuGet パッケージ Microsoft.EntityFrameworkCore.Design を追加します。

    1. [ツール] メニューから、[NuGet パッケージ マネージャー]>[ソリューションの NuGet パッケージの管理] を選択します。NuGet パッケージ マネージャー - 管理
    2. [参照] タブを選択します。
    3. Microsoft.EntityFrameworkCore.Design」と入力し、一覧から選択します。
    4. [プロジェクト] をオンにしてから、 [インストール] を選択します
    5. [ライセンスへの同意] ダイアログで [同意する] を選択します。 NuGet パッケージ マネージャー - パッケージの追加
  2. Pages/Movies フォルダーを作成します。

    1. Pages フォルダーを右クリックし、[追加]>[新しいフォルダー] の順に選択します。
    2. フォルダーに Movies という名前を付けます。
  3. Pages/Movies フォルダーを右クリックし、[追加]>[新規スキャフォールディング アイテム] の順に選択します。

    新規スキャフォールディング アイテム

  4. [新しいスキャフォールディングの追加] ダイアログで、[Entity Framework を使用する Razor Pages (CRUD)]>[追加] の順に選択します。

    スキャフォールディングを追加

  5. [Add Razor Pages using Entity Framework (CRUD)](Entity Framework を使用して Razor Pages (CRUD) を追加する) ダイアログを完了します。

    1. [モデル クラス] ドロップ ダウンで、 [Movie (RazorPagesMovie.Models)] を選択します。
    2. Data context class 行で、 + (+) 記号を選択します。
      1. [データ コンテキストの追加] ダイアログで、クラス名 RazorPagesMovie.Data.RazorPagesMovieContext が生成されます。
    3. [追加] を選択します。

    Razor Pages の追加

    Microsoft.EntityFrameworkCore.SqlServer パッケージをインストールする必要があることを示すエラー メッセージが表示された場合は、[追加]>[新規スキャフォールディング アイテム] で始まる手順を繰り返します。

appsettings.json ファイルは、ローカル データベースへの接続に使用される接続文字列を使用して更新されます。

作成および更新されたファイル

スキャフォールディングのプロセスでは、次のファイルが作成されます。

  • Pages/Movies: 作成、削除、詳細、編集、インデックス。
  • Data/RazorPagesMovieContext.cs

作成されたファイルについては、次のチュートリアルで説明します。

スキャフォールディング プロセスにより、次の強調されているコードが Program.cs ファイルに追加されます。

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Program.cs の変更については、このチュートリアルで後ほど説明します。

EF の移行機能を使用して初期データベース スキーマを作成する

Entity Framework Core の移行機能を使用すると、次のことができます。

  • 初期データベース スキーマを作成します。
  • データベース スキーマを増分方式で更新して、アプリのデータ モデルとの同期を維持します。 データベース内の既存のデータは保持されます。

このセクションでは、パッケージ マネージャー コンソール (PMC) ウィンドウを使用して、次の作業を行います。

  • 初期移行を追加します。
  • 初期移行でデータベースを更新します。
  1. [ツール] メニューで、[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

    PMC メニュー

  2. PMC で、次のコマンドを入力します。

    Add-Migration InitialCreate
    Update-Database
    
    

前のコマンドを使うと、Entity Framework Core ツールをインストールし、migrations コマンドを実行して、初期データベース スキーマを作成するコードを生成できます。

次の警告が表示されますが、これは後の手順で対処します。

エンティティ型 'Movie' の decimal 列 'Price' に型が指定されていません。 これにより、値が既定の有効桁数と小数点以下桁数に収まらない場合、自動的に切り捨てられます。 'HasColumnType()' を使用してすべての値に適合する SQL server 列の型を明示的に指定します。

migrations コマンドによって最初のデータベース スキーマを作成するコードが生成されます。 このスキーマは、DbContext で指定されたモデルに基づきます。 InitialCreate 引数は移行の命名に使用されます。 任意の名前を使用できますが、規則により、移行を説明する名前が選択されます。

update コマンドにより、適用されていない移行で Up メソッドが実行されます。 ここでは、update により、Migrations/<time-stamp>_InitialCreate.cs ファイルの Up メソッドが実行され、データベースが作成されます。

依存関係挿入に登録されるコンテキストを調べる

ASP.NET Core には、依存関係挿入が組み込まれています。 サービス (EF Core データベース コンテキストなど) は、アプリケーションの起動時に依存関係の挿入に登録されます。 これらのサービスを必要とするコンポーネント (Razor Pages など) は、コンストラクターのパラメーターを介して指定されます。 データベース コンテキスト インスタンスを取得するコンストラクター コードは、この後のチュートリアルで示します。

スキャフォールディング ツールによってデータベース コンテキストが自動的に作成され、依存関係挿入コンテナーに登録されました。 スキャフォールダーにより、次の強調されているコードが Program.cs ファイルに追加されます。

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

データ コンテキスト RazorPagesMovieContext:

  • Microsoft.EntityFrameworkCore.DbContext から派生します。
  • データ モデルに含まれるエンティティを指定します。
  • Movie モデルに関する EF Core の機能 (作成、読み取り、更新、削除など) を調整します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

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

        public DbSet<RazorPagesMovie.Models.Movie>? Movie { get; set; }
    }
}

上記のコードによって、エンティティ セットの DbSet<Movie> プロパティが作成されます。 Entity Framework の用語では、エンティティ セットは通常はデータベース テーブルに対応します。 エンティティはテーブル内の行に対応します。

DbContextOptions オブジェクトでメソッドが呼び出され、接続文字列の名前がコンテキストに渡されます。 ローカル開発の場合、構成システムによって、appsettings.json ファイルから接続文字列が読み取られます。

アプリのテスト

  1. アプリを実行し、ブラウザーで URL に /Movies を追加します ( http://localhost:port/movies )。

    次のエラー メッセージが表示される場合:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    移行手順を失敗しました。

  2. [Create New] (新規作成) リンクをテストします。

    [作成] ページ

    Note

    Price フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使う英語以外のロケール、および英語 (米国) 以外の日付形式で、jQuery 検証をサポートするには、アプリをグローバル化する必要があります。 グローバル化の手順については、この GitHub の記事をご覧ください。

  3. [編集][詳細] 、および [削除] の各リンクをテストします。

次のチュートリアルでは、スキャフォールディングによって作成されるファイルについて説明します。

完成したサンプルを使用したトラブルシューティング

解決できない問題が発生した場合は、コードを完成したプロジェクトと比較します。 完成したプロジェクトを表示またはダウンロードします (ダウンロード方法)。

次の手順

このセクションでは、データベースで映画を管理するクラスが追加されます。 アプリのモデル クラスでは、Entity Framework Core (EF Core) を使用して、データベースを操作します。 EF Core は、データ アクセスを簡略化するオブジェクト リレーショナル マッパー (O/RM) です。 モデル クラスを記述すると、EF Core によってデータベースが作成されます。

モデル クラスは EF Core に対する依存関係がないため、Plain-Old CLR Objects (単純な従来の CLR) の頭文字を取って POCO クラスと呼ばれます。 これらは、データベースに格納されるデータのプロパティを定義します。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

データ モデルの追加

  1. ソリューション エクスプローラーで、RazorPagesMovie プロジェクトを右クリックし、[追加]>[新しいフォルダー] の順に選択します。 フォルダーに「 Modelsで行うことができます。

  2. Models フォルダーを右クリックしします。 [追加]>[クラス] の順に選択します。 クラスに Movie と名前を付けます。

  3. Movie クラスに次のプロパティを追加します。

    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; }
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; }
            public decimal Price { get; set; }
        }
    }
    

Movie クラスには次が含まれます。

  • ID フィールドは、データベースで主キー用に必要です。

  • [DataType(DataType.Date)]: [DataType] 属性では、データの種類 (Date) を指定します。 この属性を使用する場合:

    • ユーザーは日付フィールドに時刻の情報を入力する必要はありません。
    • 日付のみが表示され、時刻の情報は表示されません。

DataAnnotations は、後のチュートリアルで説明されます。

プロジェクトをビルドして、コンパイル エラーがないことを確認します。

ムービー モデルのスキャフォールディング

このセクションでは、ムービー モデルがスキャフォールディングされます。 つまり、スキャフォールディング ツールにより、ムービー モデルの作成、読み取り、更新、削除の (CRUD) 操作用のページが生成されます。

  1. Pages/Movies フォルダーを作成します。

    1. Pages フォルダーを右クリックし、[追加]>[新しいフォルダー] の順に選択します。
    2. フォルダーに Movies という名前を付けます。
  2. Pages/Movies フォルダーを右クリックし、[追加]>[新規スキャフォールディング アイテム] の順に選択します。

    新規スキャフォールディング アイテム

  3. [スキャフォールディングを追加] ダイアログで、[Entity Framework を使用する Razor Pages (CRUD)]>[追加] の順に選択します。

    スキャフォールディングを追加

  4. [Add Razor Pages using Entity Framework (CRUD)](Entity Framework を使用して Razor Pages (CRUD) を追加する) ダイアログを完了します。

    1. [モデル クラス] ドロップ ダウンで、 [Movie (RazorPagesMovie.Models)] を選択します。
    2. Data context class 行で、 + (+) 記号を選択します。
      1. [データ コンテキストの追加] ダイアログで、クラス名 RazorPagesMovie.Data.RazorPagesMovieContext が生成されます。
    3. [追加] を選択します。

    Razor Pages の追加

appsettings.json ファイルは、ローカル データベースへの接続に使用される接続文字列を使用して更新されます。

作成および更新されたファイル

スキャフォールディングのプロセスでは、次のファイルが作成されます。

  • Pages/Movies: 作成、削除、詳細、編集、インデックス。
  • Data/RazorPagesMovieContext.cs

更新されたファイル

  • Startup.cs

作成および更新されたファイルについては、次のセクションで説明します。

EF の移行機能を使用して初期データベース スキーマを作成する

Entity Framework Core の移行機能を使用すると、次のことができます。

  • 初期データベース スキーマを作成します。
  • データベース スキーマを増分方式で更新して、アプリケーションのデータ モデルとの同期を維持する。 データベース内の既存のデータは保持されます。

このセクションでは、パッケージ マネージャー コンソール (PMC) ウィンドウを使用して、次の作業を行います。

  • 初期移行を追加します。
  • 初期移行でデータベースを更新します。
  1. [ツール] メニューで、[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

    PMC メニュー

  2. PMC で、次のコマンドを入力します。

    Add-Migration InitialCreate
    Update-Database
    

SQL Server では、上記のコマンドで次の警告が生成されます。"エンティティ型 'Movie' の decimal 列 'Price' に型が指定されていません。 これにより、値が既定の有効桁数と小数点以下桁数に収まらない場合、自動的に切り捨てられます。 'HasColumnType()' を使用してすべての値に適合する SQL server 列の型を明示的に指定します。"

この警告は、後の手順で解決されるため、無視してください。

migrations コマンドによって最初のデータベース スキーマを作成するコードが生成されます。 このスキーマは、DbContext で指定されたモデルに基づきます。 InitialCreate 引数は移行の命名に使用されます。 任意の名前を使用できますが、規則により、移行を説明する名前が選択されます。

update コマンドにより、適用されていない移行で Up メソッドが実行されます。 ここでは、update により、Migrations/<time-stamp>_InitialCreate.cs ファイルの Up メソッドが実行され、データベースが作成されます。

依存関係挿入に登録されるコンテキストを調べる

ASP.NET Core には、依存関係挿入が組み込まれています。 サービス (EF Core データベース コンテキストなど) は、アプリケーションの起動時に依存関係の挿入に登録されます。 これらのサービスを必要とするコンポーネント (Razor Pages など) は、コンストラクターのパラメーターを介して指定されます。 データベース コンテキスト インスタンスを取得するコンストラクター コードは、この後のチュートリアルで示します。

スキャフォールディング ツールによってデータベース コンテキストが自動的に作成され、依存関係挿入コンテナーに登録されました。

Startup.ConfigureServices メソッドを調べます。 強調表示された行は、スキャフォールダーによって追加されました。

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

RazorPagesMovieContext は、Movie モデルに関する EF Core の機能 (作成、読み取り、更新、削除など) を調整します。 データ コンテキスト (RazorPagesMovieContext) は Microsoft.EntityFrameworkCore.DbContext から派生されます。 データ コンテキストによって、データ モデルに含めるエンティティが指定されます。

using Microsoft.EntityFrameworkCore;

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

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

上記のコードによって、エンティティ セットの DbSet<Movie> プロパティが作成されます。 Entity Framework の用語では、エンティティ セットは通常はデータベース テーブルに対応します。 エンティティはテーブル内の行に対応します。

DbContextOptions オブジェクトでメソッドが呼び出され、接続文字列の名前がコンテキストに渡されます。 ローカル開発の場合、構成システムによって、appsettings.json ファイルから接続文字列が読み取られます。

アプリのテスト

  1. アプリを実行し、ブラウザーで URL に /Movies を追加します ( http://localhost:port/movies )。

    次のエラー メッセージが表示される場合:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    移行手順を失敗しました。

  2. [作成] リンクをテストします。

    [作成] ページ

    Note

    Price フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使う英語以外のロケール、および英語 (米国) 以外の日付形式で、jQuery 検証をサポートするには、アプリをグローバル化する必要があります。 グローバル化の手順については、この GitHub の記事をご覧ください。

  3. [編集][詳細] 、および [削除] の各リンクをテストします。

Entity Framework Core の SQL ログ

一般的に、ログの構成は appsettings.{Environment}.json ファイルの Logging セクションで指定されます。 SQL ステートメントをログに記録するには、appsettings.Development.json ファイルに "Microsoft.EntityFrameworkCore.Database.Command": "Information" を追加します。

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
     ,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}

上記の JSON では、SQL ステートメントがコマンド ラインと Visual Studio 出力ウィンドウに表示されます。

詳細については、「.NET Core および ASP.NET Core でのログ記録」およびこの GitHub イシューを参照してください。

次のチュートリアルでは、スキャフォールディングによって作成されるファイルについて説明します。

次の手順

このセクションでは、映画を管理するクラスが追加されます。 アプリのモデル クラスでは、Entity Framework Core (EF Core) を使用して、データベースを操作します。 EF Core は、データ アクセスを簡略化するオブジェクト リレーショナル マッパー (O/RM) です。

このモデル クラスは、EF Core に対する依存関係がないために、POCO クラス ("plain-old CLR objects"、つまり単純な従来の CLR オブジェクト) と呼ばれます。 これらは、データベースに格納されるデータのプロパティを定義します。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

データ モデルの追加

RazorPagesMovie プロジェクトを右クリックし、[追加]>[新しいフォルダー] の順に選択します。 フォルダーに「 Modelsで行うことができます。

Models フォルダーを右クリックしします。 [追加]>[クラス] の順に選択します。 クラスに Movie と名前を付けます。

Movie クラスに次のプロパティを追加します。

using System;
using System.ComponentModel.DataAnnotations;

namespace RazorPagesMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

Movie クラスには次が含まれます。

  • ID フィールドは、データベースで主キー用に必要です。

  • [DataType(DataType.Date)]: DataType 属性では、データの型 (Date) を指定します。 この属性を使用する場合:

    • ユーザーは日付フィールドに時刻の情報を入力する必要はありません。
    • 日付のみが表示され、時刻の情報は表示されません。

DataAnnotations は、後のチュートリアルで説明されます。

DataAnnotations は、後のチュートリアルで説明されます。

プロジェクトをビルドして、コンパイル エラーがないことを確認します。

ムービー モデルのスキャフォールディング

このセクションでは、ムービー モデルがスキャフォールディングされます。 つまり、スキャフォールディング ツールにより、ムービー モデルの作成、読み取り、更新、削除の (CRUD) 操作用のページが生成されます。

Pages/Movies フォルダーを作成します。

  • Pages フォルダーを右クリックし、[追加]>[新しいフォルダー] の順に選択します。
  • フォルダーに Movies という名前を付けます。

Pages/Movies フォルダーを右クリックし、[追加]>[新規スキャフォールディング アイテム] の順に選択します。

VScode の新規スキャフォールディング アイテム

[スキャフォールディングを追加] ダイアログで、[Entity Framework を使用する Razor Pages (CRUD)]>[追加] の順に選択します。

VScode でのスキャフォールディングの追加

[Add Razor Pages using Entity Framework (CRUD)](Entity Framework を使用して Razor Pages (CRUD) を追加する) ダイアログを完了します。

  • [モデル クラス] ドロップ ダウンで、 [Movie (RazorPagesMovie.Models)] を選択します。
  • [データ コンテキスト クラス] 行で、[+] (プラス) 記号を選択し、生成された名前 RazorPagesMovie.Models.RazorPagesMovieContext を RazorPagesMovie.Data.RazorPagesMovieContext に変更します。 この変更は必須ではありません。 これにより、正しい名前空間を使用してデータベース コンテキスト クラスが作成されます。
  • [追加] を選択します。

VScode での Razor Pages の追加

appsettings.json ファイルは、ローカル データベースへの接続に使用される接続文字列を使用して更新されます。

作成されたファイル

スキャフォールディングのプロセスが作成され、次のファイルが更新されます。

  • Pages/Movies: 作成、削除、詳細、編集、インデックス。
  • Data/RazorPagesMovieContext.cs

更新済み

  • Startup.cs

作成および更新されたファイルについては、次のセクションで説明します。

最初の移行

このセクションでは、パッケージ マネージャー コンソール (PMC) を使用して、次の作業を行います。

  • 初期移行を追加します。
  • 初期移行でデータベースを更新します。

[ツール] メニューで、[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

PMC メニュー

PMC で、次のコマンドを入力します。

Add-Migration InitialCreate
Update-Database

上記のコマンドで次の警告が生成されます。"エンティティ型 'Movie' の decimal 列 'Price' に型が指定されていません。 これにより、値が既定の有効桁数と小数点以下桁数に収まらない場合、自動的に切り捨てられます。 'HasColumnType()' を使用してすべての値に適合する SQL server 列の型を明示的に指定します。"

この警告は、後の手順で解決されるため、無視してください。

移行コマンドによって、最初のデータベース スキーマを作成するコードが生成されます。 このスキーマは、DbContext で指定されたモデルに基づきます。 InitialCreate 引数は移行の命名に使用されます。 任意の名前を使用できますが、規則により、移行を説明する名前が選択されます。

update コマンドにより、適用されていない移行で Up メソッドが実行されます。 ここでは、update により、Migrations/<time-stamp>_InitialCreate.cs ファイルの Up メソッドが実行され、データベースが作成されます。

依存関係挿入に登録されるコンテキストを調べる

ASP.NET Core には、依存関係挿入が組み込まれています。 サービス (EF Core データベース コンテキストなど) は、アプリケーションの起動時に依存関係の挿入に登録されます。 これらのサービスを必要とするコンポーネント (Razor Pages など) は、コンストラクターのパラメーターを介して指定されます。 データベース コンテキスト インスタンスを取得するコンストラクター コードは、この後のチュートリアルで示します。

スキャフォールディング ツールによってデータベース コンテキストが自動的に作成され、依存関係挿入コンテナーに登録されました。

Startup.ConfigureServices メソッドを調べます。 強調表示された行は、スキャフォールダーによって追加されました。

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

RazorPagesMovieContext は、Movie モデルに関する EF Core の機能 (作成、読み取り、更新、削除など) を調整します。 データ コンテキスト (RazorPagesMovieContext) は Microsoft.EntityFrameworkCore.DbContext から派生されます。 データ コンテキストによって、データ モデルに含めるエンティティが指定されます。

using Microsoft.EntityFrameworkCore;

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

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

上記のコードによって、エンティティ セットの DbSet<Movie> プロパティが作成されます。 Entity Framework の用語では、エンティティ セットは通常はデータベース テーブルに対応します。 エンティティはテーブル内の行に対応します。

DbContextOptions オブジェクトでメソッドが呼び出され、接続文字列の名前がコンテキストに渡されます。 ローカル開発の場合、構成システムによって、appsettings.json ファイルから接続文字列が読み取られます。

アプリのテスト

  • アプリを実行し、ブラウザーで URL に /Movies を追加します ( http://localhost:port/movies )。

エラーが発生した場合は、次のようにします。

SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.

移行手順を失敗しました。

  • [作成] リンクをテストします。

    [作成] ページ

    Note

    Price フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使う英語以外のロケール、および英語 (米国) 以外の日付形式で、jQuery 検証をサポートするには、アプリをグローバル化する必要があります。 グローバル化の手順については、この GitHub の記事をご覧ください。

  • [編集][詳細] 、および [削除] の各リンクをテストします。

次のチュートリアルでは、スキャフォールディングによって作成されるファイルについて説明します。

次の手順