Note
これは、この記事の最新バージョンではありません。 現在のリリースについては、 この記事の .NET 10 バージョンを参照してください。
Warning
このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、 この記事の .NET 10 バージョンを参照してください。
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 のConfigurationシステムは 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"
}
}
Warning
この記事では、ユーザーが認証済みである必要がないローカルデータベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと本番運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。
SQL Server Express ローカルDB
LocalDB は、プログラム開発用に設計された SQL Server Express データベース エンジンの軽量バージョンです。 LocalDB は必要に応じて起動し、ユーザー モードで実行されるので、複雑な設定は不要です。 既定では、LocalDB は*.mdf ディレクトリC:\Users\<user>\データベース ファイルを作成します。
[表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。
Movieテーブルを右クリックし、Movieを選択します。
IDの横のキー アイコンに注意してください。 既定では、EF で主キーにIDという名前のプロパティが作成されます。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 を変更します。
-
app.Services.CreateScope()を使用してサービス スコープを作成します。 - スコープからサービス プロバイダー (IServiceProvider) を取得します。
- サービス プロバイダーを渡して、
SeedData.Initializeメソッドを呼び出します。 - seed メソッドが完了した時点で、サービス スコープを破棄します。
usingステートメントにより、スコープが確実に破棄されます。
Update-Databaseを実行しないと、次の例外が発生します。
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
アプリをテストする
シード メソッドが実行されるように、データベース内のすべてのレコードを削除します。 アプリを停止および起動して、データベースに初期データを投入します。 データベースがシードされていない場合は、if (context.Movie.Any()) にブレークポイントを設定し、コードをステップ実行します。
アプリにはシードデータが表示されます:
次のステップ
RazorPagesMovieContext オブジェクトは、データベースへの接続と、Movie オブジェクトのデータベースレコードへの対応付けを行います。 データベース コンテキストは、Program.csで Dependency Injection コンテナーに登録されます。
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 のConfigurationシステムは 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"
}
}
Warning
この記事では、ユーザーが認証済みである必要がないローカルデータベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと本番運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。
SQL Server Express ローカルDB
LocalDB は、プログラム開発向けの SQL Server Express データベース エンジンの軽量版です。 LocalDB は必要に応じて起動し、ユーザー モードで実行されるので、複雑な設定は不要です。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。
[表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。
Movieテーブルを右クリックし、Movieを選択します。
IDの横のキー アイコンに注意してください。 既定では、EF で主キーにIDという名前のプロパティが作成されます。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 が、次のことを行うように変更されています。
-
app.Services.CreateScope()を使用してサービス スコープを作成します。 - スコープからサービス プロバイダー (IServiceProvider) を取得します。
- サービス プロバイダーを渡して、
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()) にブレークポイントを設定し、コードをステップ実行します。
アプリにはシードデータが表示されます:
次のステップ
RazorPagesMovieContext オブジェクトは、データベースへの接続と、Movie オブジェクトのデータベースレコードへの対応付けを行います。 データベース コンテキストは、Program.csで Dependency Injection コンテナーに登録されます。
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 のConfigurationシステムは 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"
}
}
Warning
この記事では、ユーザーが認証済みである必要がないローカルデータベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと本番運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。
SQL Server Express ローカルDB
LocalDB は、プログラム開発向けの SQL Server Express データベース エンジンの軽量版です。 LocalDB は必要に応じて起動し、ユーザー モードで実行されるので、複雑な設定は不要です。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。
[表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。
Movieテーブルを右クリックし、Movieを選択します。
IDの横のキー アイコンに注意してください。 既定では、EF で主キーにIDという名前のプロパティが作成されます。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 が、次のことを行うように変更されています。
-
app.Services.CreateScope()を使用してサービス スコープを作成します。 - スコープからサービス プロバイダー (IServiceProvider) を取得します。
- サービス プロバイダーを渡して、
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()) にブレークポイントを設定し、コードをステップ実行します。
アプリにはシードデータが表示されます:
次のステップ
RazorPagesMovieContext オブジェクトは、データベースへの接続と、Movie オブジェクトのデータベースレコードへの対応付けを行います。 データベース コンテキストは、Program.csで Dependency Injection コンテナーに登録されます。
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 のConfigurationシステムは 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"
}
}
Warning
この記事では、ユーザーが認証済みである必要がないローカルデータベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと本番運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。
SQL Server Express ローカルDB
LocalDB は、プログラム開発向けの SQL Server Express データベース エンジンの軽量版です。 LocalDB は必要に応じて起動し、ユーザー モードで実行されるので、複雑な設定は不要です。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。
[表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。
Movieテーブルを右クリックし、Movieを選択します。
IDの横のキー アイコンに注意してください。 既定では、EF で主キーにIDという名前のプロパティが作成されます。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()) にブレークポイントを設定し、コードをステップ実行します。
アプリにはシードデータが表示されます:
次のステップ
RazorPagesMovieContext オブジェクトは、データベースへの接続と、Movie オブジェクトのデータベースレコードへの対応付けを行います。 データベース コンテキストは、Program.csで Dependency Injection コンテナーに登録されます。
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 のConfigurationシステムは 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"
}
}
Warning
この記事では、ユーザーが認証済みである必要がないローカルデータベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと本番運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。
SQL Server Express ローカルDB
LocalDB は、プログラム開発向けの SQL Server Express データベース エンジンの軽量版です。 LocalDB は必要に応じて起動し、ユーザー モードで実行されるので、複雑な設定は不要です。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。
[表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。
Movieテーブルを右クリックし、Movieを選択します。
IDの横のキー アイコンに注意してください。 既定では、EF で主キーにIDという名前のプロパティが作成されます。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()) にブレークポイントを設定し、コードをステップ実行します。
アプリにはシードデータが表示されます:
次のステップ
サンプル コードを表示またはダウンロードします (ダウンロード方法)。
RazorPagesMovieContext オブジェクトは、データベースへの接続と、Movie オブジェクトのデータベースレコードへの対応付けを行います。 データベース コンテキストは、 の ConfigureServices メソッドでStartup.csコンテナーに登録されます。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
ASP.NET Core のConfigurationシステムは 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"
}
}
Warning
この記事では、ユーザーが認証済みである必要がないローカルデータベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと本番運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。
SQL Server Express ローカルDB
LocalDB は、プログラム開発向けの SQL Server Express データベース エンジンの軽量版です。 LocalDB は必要に応じて起動し、ユーザー モードで実行されるので、複雑な設定は不要です。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。
[表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。
Movieテーブルを右クリックし、Movieを選択します。
IDの横のキー アイコンに注意してください。 既定では、EF で主キーにIDという名前のプロパティが作成されます。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 アイコンを右クリックし、[終了] または [サイトの停止] を選択します:
非デバッグ モードでアプリが実行されている場合は、F5 キーを押してデバッグ モードで実行します。
デバッグ モードでアプリが実行されている場合は、デバッガーを停止して、F5 キーを押します。
アプリにはシードデータが表示されます:
次のステップ
サンプル コードを表示またはダウンロードします (ダウンロード方法)。
RazorPagesMovieContext オブジェクトは、データベースへの接続と、Movie オブジェクトのデータベースレコードへの対応付けを行います。 データベース コンテキストは、 の ConfigureServices メソッドでStartup.csコンテナーに登録されます。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
ASP.NET Core のConfigurationシステムは 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"
}
}
Warning
この記事では、ユーザーが認証済みである必要がないローカルデータベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと本番運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。
SQL Server Express ローカルDB
LocalDB は、プログラム開発向けの SQL Server Express データベース エンジンの軽量版です。 LocalDB は必要に応じて起動し、ユーザー モードで実行されるので、複雑な設定は不要です。 LocalDB データベースでは、既定で C:\Users\<user>\ ディレクトリに *.mdf ファイルが作成されます。
[表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。
Movieテーブルを右クリックし、Movieを選択します。
ID の横のキー アイコンに注意してください。 既定では、EF で主キーに ID という名前のプロパティが作成されます。
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 のシステム トレイ アイコンを右クリックし、[終了] または [サイトの停止] をクリックします。
- 非デバッグ モードでアプリが実行されている場合は、F5 キーを押してデバッグ モードで実行します。
- デバッグ モードでアプリが実行されている場合は、デバッガーを停止して、F5 キーを押します。
アプリにはシードデータが表示されます:
次のステップ
ASP.NET Core