次の方法で共有


Razor ページのチュートリアル シリーズのパート 4。

Note

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

警告

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

重要

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

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

作者: Joe Audette

RazorPagesMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、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.")));

ASP.NET Core の構成システムでは ConnectionString キーが読み取られます。 ローカルで開発する場合は、構成によって appsettings.json ファイルから接続文字列が取得されます。

生成される接続文字列は、次の JSON のようになります。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-f2e0482c-952d-4b1c-afe9-a1a3dfe52e55;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

警告

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

SQL Server Express LocalDB

LocalDB は、プログラム開発を対象にした、SQL Server Express データベース エンジンの軽量版です。 LocalDB は要求時に開始され、ユーザー モードで実行されるため、複雑な構成はありません。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。

  1. [表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。

    [View] メニュー

  2. Movie テーブルを右クリックし、Movie を選択します。

    Movie テーブルに対して開かれたコンテキスト メニュー

    デザイナーに開かれた Movie テーブル

    ID の横のキー アイコンに注意してください。 既定では、EF で主キーに ID という名前のプロパティが作成されます。

  3. Movie テーブルを右クリックし、Movie を選択します。

    開いた Movie テーブルにテーブル データが表示されています

データベースのシード

次のコードを使用して、SeedData フォルダーに SeedData という名前の新しいクラスを作成します。

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new RazorPagesMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<RazorPagesMovieContext>>()))
        {
            if (context == null || context.Movie == null)
            {
                throw new ArgumentNullException("Null RazorPagesMovieContext");
            }

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

            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    Genre = "Romantic Comedy",
                    Price = 7.99M
                },

                new Movie
                {
                    Title = "Ghostbusters ",
                    ReleaseDate = DateTime.Parse("1984-3-13"),
                    Genre = "Comedy",
                    Price = 8.99M
                },

                new Movie
                {
                    Title = "Ghostbusters 2",
                    ReleaseDate = DateTime.Parse("1986-2-23"),
                    Genre = "Comedy",
                    Price = 9.99M
                },

                new Movie
                {
                    Title = "Rio Bravo",
                    ReleaseDate = DateTime.Parse("1959-4-15"),
                    Genre = "Western",
                    Price = 3.99M
                }
            );
            context.SaveChanges();
        }
    }
}

データベースにムービーがある場合、シード初期化子が返され、ムービーは追加されません。

if (context.Movie.Any())
{
    return;
}

シード初期化子の追加

次の強調表示されているコードを使用して、Program.cs を更新します。

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;

var builder = WebApplication.CreateBuilder(args);

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

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

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

app.Run();

以前のコードでは、Program.cs が、次のことを行うように変更されています。

  • 依存関係挿入 (DI) コンテナーからデータベース コンテキスト インスタンスを取得します。
  • seedData.Initialize メソッドを呼び出すと、データベース コンテキスト インスタンスに渡されます。
  • seed メソッドが完了したら、コンテキストを破棄します。 using ステートメントを使用すると、コンテキストが確実に破棄されます。

Update-Database が実行されていなかった場合、次の例外が発生します。

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

アプリのテスト

データベース内のすべてのレコードを削除します (そのため Seed メソッドが実行されます)。 アプリを停止および起動して、データベースをシードします。 データベースがシード処理されない場合は、if (context.Movie.Any()) にブレークポイントを設定し、コードをステップ実行します。

アプリにシードされたデータが表示されます。

ムービー データが表示されたブラウザーで開いている Movie アプリケーション

次のステップ

RazorPagesMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、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();

ASP.NET Core の構成システムでは ConnectionString キーが読み取られます。 ローカルで開発する場合は、構成によって appsettings.json ファイルから接続文字列が取得されます。

生成される接続文字列は、次の JSON のようになります。

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

警告

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

SQL Server Express LocalDB

LocalDB は、プログラム開発を対象にした、SQL Server Express データベース エンジンの軽量版です。 LocalDB は要求時に開始され、ユーザー モードで実行されるため、複雑な構成はありません。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。

  1. [表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。

    [View] メニュー

  2. Movie テーブルを右クリックし、Movie を選択します。

    Movie テーブルに対して開かれたコンテキスト メニュー

    デザイナーに開かれた Movie テーブル

    ID の横のキー アイコンに注意してください。 既定では、EF で主キーに ID という名前のプロパティが作成されます。

  3. Movie テーブルを右クリックし、Movie を選択します。

    開いた Movie テーブルにテーブル データが表示されています

データベースのシード

次のコードを使用して、SeedData フォルダーに SeedData という名前の新しいクラスを作成します。

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new RazorPagesMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<RazorPagesMovieContext>>()))
        {
            if (context == null || context.Movie == null)
            {
                throw new ArgumentNullException("Null RazorPagesMovieContext");
            }

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

            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    Genre = "Romantic Comedy",
                    Price = 7.99M
                },

                new Movie
                {
                    Title = "Ghostbusters ",
                    ReleaseDate = DateTime.Parse("1984-3-13"),
                    Genre = "Comedy",
                    Price = 8.99M
                },

                new Movie
                {
                    Title = "Ghostbusters 2",
                    ReleaseDate = DateTime.Parse("1986-2-23"),
                    Genre = "Comedy",
                    Price = 9.99M
                },

                new Movie
                {
                    Title = "Rio Bravo",
                    ReleaseDate = DateTime.Parse("1959-4-15"),
                    Genre = "Western",
                    Price = 3.99M
                }
            );
            context.SaveChanges();
        }
    }
}

データベースにムービーがある場合、シード初期化子が返され、ムービーは追加されません。

if (context.Movie.Any())
{
    return;
}

シード初期化子の追加

次の強調表示されているコードを使用して、Program.cs を更新します。

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;

var builder = WebApplication.CreateBuilder(args);

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

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

以前のコードでは、Program.cs が、次のことを行うように変更されています。

  • 依存関係挿入 (DI) コンテナーからデータベース コンテキスト インスタンスを取得します。
  • seedData.Initialize メソッドを呼び出すと、データベース コンテキスト インスタンスに渡されます。
  • seed メソッドが完了したら、コンテキストを破棄します。 using ステートメントを使用すると、コンテキストが確実に破棄されます。

Update-Database が実行されていなかった場合、次の例外が発生します。

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

アプリのテスト

データベース内のすべてのレコードを削除します (そのため Seed メソッドが実行されます)。 アプリを停止および起動して、データベースをシードします。 データベースがシード処理されない場合は、if (context.Movie.Any()) にブレークポイントを設定し、コードをステップ実行します。

アプリにシードされたデータが表示されます。

ムービー データが表示されたブラウザーで開いている Movie アプリケーション

次のステップ

RazorPagesMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、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();

ASP.NET Core の構成システムでは ConnectionString キーが読み取られます。 ローカルで開発する場合は、構成によって appsettings.json ファイルから接続文字列が取得されます。

生成される接続文字列は、次の JSON のようになります。

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

警告

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

SQL Server Express LocalDB

LocalDB は、プログラム開発を対象にした、SQL Server Express データベース エンジンの軽量版です。 LocalDB は要求時に開始され、ユーザー モードで実行されるため、複雑な構成はありません。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。

  1. [表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。

    [View] メニュー

  2. Movie テーブルを右クリックし、Movie を選択します。

    Movie テーブルに対して開かれたコンテキスト メニュー

    デザイナーに開かれた Movie テーブル

    ID の横のキー アイコンに注意してください。 既定では、EF で主キーに ID という名前のプロパティが作成されます。

  3. Movie テーブルを右クリックし、Movie を選択します。

    開いた Movie テーブルにテーブル データが表示されています

データベースのシード

次のコードを使用して、SeedData フォルダーに SeedData という名前の新しいクラスを作成します。

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new RazorPagesMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<RazorPagesMovieContext>>()))
        {
            if (context == null || context.Movie == null)
            {
                throw new ArgumentNullException("Null RazorPagesMovieContext");
            }

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

            context.Movie.AddRange(
                new Movie
                {
                    Title = "When Harry Met Sally",
                    ReleaseDate = DateTime.Parse("1989-2-12"),
                    Genre = "Romantic Comedy",
                    Price = 7.99M
                },

                new Movie
                {
                    Title = "Ghostbusters ",
                    ReleaseDate = DateTime.Parse("1984-3-13"),
                    Genre = "Comedy",
                    Price = 8.99M
                },

                new Movie
                {
                    Title = "Ghostbusters 2",
                    ReleaseDate = DateTime.Parse("1986-2-23"),
                    Genre = "Comedy",
                    Price = 9.99M
                },

                new Movie
                {
                    Title = "Rio Bravo",
                    ReleaseDate = DateTime.Parse("1959-4-15"),
                    Genre = "Western",
                    Price = 3.99M
                }
            );
            context.SaveChanges();
        }
    }
}

データベースにムービーがある場合、シード初期化子が返され、ムービーは追加されません。

if (context.Movie.Any())
{
    return;
}

シード初期化子の追加

次の強調表示されているコードを使用して、Program.cs を更新します。

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;

var builder = WebApplication.CreateBuilder(args);

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

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

以前のコードでは、Program.cs が、次のことを行うように変更されています。

  • 依存関係挿入 (DI) コンテナーからデータベース コンテキスト インスタンスを取得します。
  • seedData.Initialize メソッドを呼び出すと、データベース コンテキスト インスタンスに渡されます。
  • seed メソッドが完了したら、コンテキストを破棄します。 using ステートメントを使用すると、コンテキストが確実に破棄されます。

Update-Database が実行されていなかった場合、次の例外が発生します。

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

アプリのテスト

データベース内のすべてのレコードを削除します (そのため Seed メソッドが実行されます)。 アプリを停止および起動して、データベースをシードします。 データベースがシード処理されない場合は、if (context.Movie.Any()) にブレークポイントを設定し、コードをステップ実行します。

アプリにシードされたデータが表示されます。

ムービー データが表示されたブラウザーで開いている Movie アプリケーション

次のステップ

RazorPagesMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、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();

ASP.NET Core の構成システムでは ConnectionString キーが読み取られます。 ローカルで開発する場合は、構成によって appsettings.json ファイルから接続文字列が取得されます。

生成される接続文字列は、次の JSON のようになります。

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

警告

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

SQL Server Express LocalDB

LocalDB は、プログラム開発を対象にした、SQL Server Express データベース エンジンの軽量版です。 LocalDB は要求時に開始され、ユーザー モードで実行されるため、複雑な構成はありません。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。

  1. [表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。

    [View] メニュー

  2. Movie テーブルを右クリックし、Movie を選択します。

    Movie テーブルに対して開かれたコンテキスト メニュー

    デザイナーに開かれた Movie テーブル

    ID の横のキー アイコンに注意してください。 既定では、EF で主キーに ID という名前のプロパティが作成されます。

  3. Movie テーブルを右クリックし、Movie を選択します。

    開いた Movie テーブルにテーブル データが表示されています

データベースのシード

次のコードを使用して、SeedData フォルダーに SeedData という名前の新しいクラスを作成します。

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                if (context == null || context.Movie == null)
                {
                    throw new ArgumentNullException("Null RazorPagesMovieContext");
                }

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

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

データベースにムービーがある場合、シード初期化子が返され、ムービーは追加されません。

if (context.Movie.Any())
{
    return;
}

シード初期化子の追加

次の強調表示されているコードを使用して、Program.cs を更新します。

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

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

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

以前のコードでは、Program.cs が、次のことを行うように変更されています。

  • 依存関係挿入 (DI) コンテナーからデータベース コンテキスト インスタンスを取得します。
  • seedData.Initialize メソッドを呼び出すと、データベース コンテキスト インスタンスに渡されます。
  • seed メソッドが完了したら、コンテキストを破棄します。 using ステートメントを使用すると、コンテキストが確実に破棄されます。

Update-Database が実行されていなかった場合、次の例外が発生します。

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

アプリのテスト

データベース内のすべてのレコードを削除します (そのため Seed メソッドが実行されます)。 アプリを停止および起動して、データベースをシードします。 データベースがシード処理されない場合は、if (context.Movie.Any()) にブレークポイントを設定し、コードをステップ実行します。

アプリにシードされたデータが表示されます。

ムービー データが表示されたブラウザーで開いている Movie アプリケーション

次のステップ

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

RazorPagesMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、Startup.csConfigureServices メソッドで依存関係の挿入コンテナーに登録されます。

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

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

ASP.NET Core の構成システムでは ConnectionString キーが読み取られます。 ローカルで開発する場合は、構成によって appsettings.json ファイルから接続文字列が取得されます。

生成される接続文字列は、次の JSON のようになります。

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

警告

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

SQL Server Express LocalDB

LocalDB は、プログラム開発を対象にした、SQL Server Express データベース エンジンの軽量版です。 LocalDB は要求時に開始され、ユーザー モードで実行されるため、複雑な構成はありません。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。

  1. [表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。

    [View] メニュー

  2. Movie テーブルを右クリックし、Movie を選択します。

    Movie テーブルに対して開かれたコンテキスト メニュー

    デザイナーに開かれた Movie テーブル

    ID の横のキー アイコンに注意してください。 既定では、EF で主キーに ID という名前のプロパティが作成されます。

  3. Movie テーブルを右クリックし、Movie を選択します。

    開いた Movie テーブルにテーブル データが表示されています

データベースのシード

次のコードを使用して、SeedData フォルダーに SeedData という名前の新しいクラスを作成します。

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

データベースにムービーがある場合、シード初期化子が返され、ムービーは追加されません。

if (context.Movie.Any())
{
    return;
}

シード初期化子の追加

Program.cs の内容を次のコードに置き換えます。

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;

namespace RazorPagesMovie
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    SeedData.Initialize(services);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred seeding the DB.");
                }
            }

            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

以前のコードでは、Main メソッドが次のように変更されています。

  • 依存関係挿入コンテナーからデータベース コンテキスト インスタンスを取得します。
  • seedData.Initialize メソッドを呼び出すと、データベース コンテキスト インスタンスに渡されます。
  • seed メソッドが完了したら、コンテキストを破棄します。 using ステートメントを使用すると、コンテキストが確実に破棄されます。

Update-Database が実行されていなかった場合、次の例外が発生します。

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

アプリのテスト

  1. データベース内のすべてのレコードを削除します。 ブラウザーの削除リンクを使用するか、SSOX から行います。

  2. Startup クラスでメソッドを呼び出してアプリを強制的に初期化して、シード メソッドが実行されるようにします。 強制的に初期化するには、IIS Express を停止してから再起動する必要があります。 次の方法のいずれかを使用して、IIS を停止してから再起動します。

    1. 通知領域にある IIS Express システム トレイ アイコンを右クリックし、 [終了] または [サイトの停止] を選択します。

      IIS Express システム トレイ アイコン

      コンテキスト メニュー

    2. 非デバッグ モードでアプリが実行されている場合は、F5 キーを押してデバッグ モードで実行します。

    3. デバッグ モードでアプリが実行されている場合は、デバッガーを停止して、F5 キーを押します。

アプリにシードされたデータが表示されます。

ムービー データが表示されたブラウザーで開いている Movie アプリケーション

次のステップ

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

RazorPagesMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、Startup.csConfigureServices メソッドで依存関係の挿入コンテナーに登録されます。

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

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

ASP.NET Core の構成システムでは ConnectionString キーが読み取られます。 ローカルで開発する場合は、構成によって appsettings.json ファイルから接続文字列が取得されます。

生成される接続文字列は、次のようになります。

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

警告

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

SQL Server Express LocalDB

LocalDB は、プログラム開発を対象にした、SQL Server Express データベース エンジンの軽量版です。 LocalDB は要求時に開始され、ユーザー モードで実行されるため、複雑な構成はありません。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。

  • [表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。

    [View] メニュー

  • Movie テーブルを右クリックし、Movie を選択します。

    Movie テーブルに対して開かれたコンテキスト メニュー

    デザイナーに開かれた Movie テーブル

ID の横のキー アイコンに注意してください。 既定では、EF で主キーに ID という名前のプロパティが作成されます。

  • Movie テーブルを右クリックし、Movie を選択します。

    開いた Movie テーブルにテーブル データが表示されています

データベースのシード

次のコードを使用して、SeedData フォルダーに SeedData という名前の新しいクラスを作成します。

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;

namespace RazorPagesMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new RazorPagesMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<RazorPagesMovieContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                    new Movie
                    {
                        Title = "When Harry Met Sally",
                        ReleaseDate = DateTime.Parse("1989-2-12"),
                        Genre = "Romantic Comedy",
                        Price = 7.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters ",
                        ReleaseDate = DateTime.Parse("1984-3-13"),
                        Genre = "Comedy",
                        Price = 8.99M
                    },

                    new Movie
                    {
                        Title = "Ghostbusters 2",
                        ReleaseDate = DateTime.Parse("1986-2-23"),
                        Genre = "Comedy",
                        Price = 9.99M
                    },

                    new Movie
                    {
                        Title = "Rio Bravo",
                        ReleaseDate = DateTime.Parse("1959-4-15"),
                        Genre = "Western",
                        Price = 3.99M
                    }
                );
                context.SaveChanges();
            }
        }
    }
}

データベースにムービーがある場合、シード初期化子が返され、ムービーは追加されません。

if (context.Movie.Any())
{
    return;
}

シード初期化子の追加

Program.cs の内容を次のコードに置き換えます。

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;

namespace RazorPagesMovie
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    SeedData.Initialize(services);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred seeding the DB.");
                }
            }
            
            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

以前のコードでは、Main メソッドが次のように変更されています。

  • 依存関係挿入コンテナーからデータベース コンテキスト インスタンスを取得します。
  • seedData.Initialize メソッドを呼び出すと、データベース コンテキスト インスタンスに渡されます。
  • seed メソッドが完了したら、コンテキストを破棄します。 using ステートメントを使用すると、コンテキストが確実に破棄されます。

Update-Database が実行されていなかった場合、次の例外が発生します。

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

アプリのテスト

  • データベース内のすべてのレコードを削除します。 ブラウザーの削除リンクを使用するか、SSOX から行います。

  • Startup クラスでメソッドを呼び出してアプリを強制的に初期化して、シード メソッドが実行されるようにします。 強制的に初期化するには、IIS Express を停止してから再起動する必要があります。 次の方法のいずれかを使用して、IIS を停止してから再起動します。

    • 通知領域にある IIS Express システム トレイ アイコンを右クリックし、 [終了] または [サイトの停止] をタップします。

      IIS Express システム トレイ アイコン

      コンテキスト メニュー

      • 非デバッグ モードでアプリが実行されている場合は、F5 キーを押してデバッグ モードで実行します。
      • デバッグ モードでアプリが実行されている場合は、デバッガーを停止して、F5 キーを押します。

アプリにシードされたデータが表示されます。

ムービー データが表示された、Chrome で開かれているムービー アプリケーション

次のステップ