Note
これは、この記事の最新バージョンではありません。 現在のリリースについては、 この記事の .NET 10 バージョンを参照してください。
Warning
このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、 この記事の .NET 10 バージョンを参照してください。
作者: Joe Audette
RazorPagesMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストを Program.cs の依存関係の挿入コンテナーに登録します。
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.");
builder.Services.AddDbContext<RazorPagesMovieContext>(options => options.UseSqlServer(connectionString));
// Add services to the container.
builder.Services.AddRazorPages();
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を選択します。
データベースをシードする
次のコードを使用して、Models フォルダーに SeedData という名前の新しいクラスを作成します。
using Microsoft.EntityFrameworkCore;
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.Models;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.");
builder.Services.AddDbContext<RazorPagesMovieContext>(options => options.UseSqlServer(connectionString));
// Add services to the container.
builder.Services.AddRazorPages();
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
// 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()
.WithStaticAssets();
app.Run();
前のコードでは、次の手順を実行するように Program.cs を変更します。
-
app.Services.CreateScope()を使用してサービス スコープを作成します。 - スコープからサービス プロバイダー (IServiceProvider) を取得します。
- サービス プロバイダーを渡して、
SeedData.Initializeメソッドを呼び出します。 - シード メソッドが完了した時点で、サービス スコープを破棄します。
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 にある依存関係の挿入コンテナーに登録されます。
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を選択します。
データベースをシードする
次のコードを使用して、Models フォルダーに 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メソッドを呼び出します。 - シード メソッドが完了した時点で、サービス スコープを破棄します。
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 にある依存関係の挿入コンテナーに登録されます。
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を選択します。
データベースをシードする
次のコードを使用して、Models フォルダーに 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メソッドを呼び出します。 - シード メソッドが完了した時点で、サービス スコープを破棄します。
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 にある依存関係の挿入コンテナーに登録されます。
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を選択します。
データベースをシードする
次のコードを使用して、Models フォルダーに 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 にある依存関係の挿入コンテナーに登録されます。
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を選択します。
データベースをシードする
次のコードを使用して、Models フォルダーに 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 オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、Startup.cs の ConfigureServices メソッドで依存関係の挿入コンテナーに登録されます。
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を選択します。
データベースをシードする
次のコードを使用して、Models フォルダーに 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 オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、Startup.cs の ConfigureServices メソッドで依存関係の挿入コンテナーに登録されます。
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を選択します。
データベースをシードする
次のコードを使用して、Models フォルダーに 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