次の方法で共有


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

Note

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

Warning

このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

Important

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

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

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

モデル クラスは に対する依存関係がないため、Plain-Old CLR EF Corebjects (単純な従来の 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 属性。 この属性を使用する場合:

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

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

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

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

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

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

    1. Pages フォルダーを右クリックし、>> の順に選択します。
    2. フォルダーに Movies という名前を付けます。
  2. Pages/Movies フォルダーを右クリックし、>> の順に選択します。

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

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

    Add Scaffold

  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. Select Add.

    Razor Pages の追加

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

Warning

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

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

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

  • 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.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages();

app.Run();

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

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

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

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

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

  • 初期移行を追加します。

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

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

    PMC menu

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

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

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

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

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

    Update-Database
    

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

データ コンテキスト RazorPagesMovieContext:

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

生成されたファイル内の RazorPagesMovieContext クラスData/RazorPagesMovieContext.cs:

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] (新規作成) リンクをテストします。

    Create page

    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.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages();

app.Run();

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

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

Next steps

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

モデル クラスは に対する依存関係がないため、Plain-Old CLR EF Corebjects (単純な従来の 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 属性。 この属性を使用する場合:

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

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

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

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

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

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

    1. Pages フォルダーを右クリックし、>> の順に選択します。
    2. フォルダーに Movies という名前を付けます。
  2. Pages/Movies フォルダーを右クリックし、>> の順に選択します。

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

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

    Add Scaffold

  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. Select Add.

    Razor Pages の追加

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

Warning

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

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

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

  • 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) ウィンドウを使用して、次の作業を行います。

  • 初期移行を追加します。

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

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

    PMC menu

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

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

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

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

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

    Update-Database
    

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

データ コンテキスト RazorPagesMovieContext:

  • Microsoft.EntityFrameworkCore.DbContext から派生します。
  • データ モデルに含まれるエンティティを指定します。
  • EF Core モデルに関する Movie の機能 (作成、読み取り、更新、削除など) を調整します。
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] (新規作成) リンクをテストします。

    Create page

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

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

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

Next steps

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

モデル クラスは に対する依存関係がないため、Plain-Old CLR EF Corebjects (単純な従来の 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 属性。 この属性を使用する場合:

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

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

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

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

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

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

    1. Pages フォルダーを右クリックし、>> の順に選択します。
    2. フォルダーに Movies という名前を付けます。
  2. Pages/Movies フォルダーを右クリックし、>> の順に選択します。

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

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

    Add Scaffold

  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. Select Add.

    Razor Pages の追加

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

Warning

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

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

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

  • 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 menu

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

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

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

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

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

データ コンテキスト RazorPagesMovieContext:

  • Microsoft.EntityFrameworkCore.DbContext から派生します。
  • データ モデルに含まれるエンティティを指定します。
  • EF Core モデルに関する Movie の機能 (作成、読み取り、更新、削除など) を調整します。
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] (新規作成) リンクをテストします。

    Create page

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

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

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

Next steps

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

モデル クラスは に対する依存関係がないため、Plain-Old CLR EF Corebjects (単純な従来の 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 属性。 この属性を使用する場合:

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

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)]>[追加] の順に選択します。

    Add Scaffold

  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. Select Add.

    Razor Pages の追加

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

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

Warning

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

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

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

  • 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 menu

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

    Add-Migration InitialCreate
    Update-Database
    
    

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

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

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

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

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

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

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 から派生します。
  • データ モデルに含まれるエンティティを指定します。
  • EF Core モデルに関する Movie の機能 (作成、読み取り、更新、削除など) を調整します。
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] (新規作成) リンクをテストします。

    Create page

    Note

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

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

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

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

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

Next steps

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

モデル クラスは に対する依存関係がないため、Plain-Old CLR EF Corebjects (単純な従来の 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)]>[追加] の順に選択します。

    Add Scaffold

  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. Select Add.

    Razor Pages の追加

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

Warning

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

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

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

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

Updated files

  • Startup.cs

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

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

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

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

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

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

    PMC menu

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

    Add-Migration InitialCreate
    Update-Database
    

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

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

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

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

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

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 は、EF Core モデルに関する Movie の機能 (作成、読み取り、更新、削除など) を調整します。 データ コンテキスト (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. [作成] リンクをテストします。

    Create page

    Note

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

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

Entity Framework Core の SQL ログ

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

{
  "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 と ASP.NET Core のログ記録と この GitHub の問題を参照してください。

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

Next steps

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

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

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

Warning

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

データ モデルの追加

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 に変更します。 この変更は必須ではありません。 これにより、正しい名前空間を使用してデータベース コンテキスト クラスが作成されます。
  • Select Add.

VScode での Razor Pages の追加

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

Files created

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

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

Updated

  • Startup.cs

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

Initial migration

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

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

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

PMC menu

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

Add-Migration InitialCreate
Update-Database

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

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

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

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

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

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 は、EF Core モデルに関する Movie の機能 (作成、読み取り、更新、削除など) を調整します。 データ コンテキスト (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'.

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

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

    Create page

    Note

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

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

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

Next steps