Blazor Web アプリを .NET 9 の「Individual Accounts」で新規作成したのに、ログイン画面で Error 4060 や RetryLimitExceededException が出て接続に失敗──この症状の多くは「LocalDB が動いていない/データベースがまだ作られていない」ことが原因です。本記事は、最短で復旧する手順と、つまずきやすい落とし穴、実務で役立つ確認ポイントまでを一気通貫で解説します。
Blazor Web アプリが Identity 用 LocalDB に接続できない:状況整理
- .NET 9、認証方式は Individual Accounts(ASP.NET Core Identity)を選択。
- appsettings.json に自動生成された接続文字列は次のような形式:
"ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-BlazorWebWithIdentity-XXXX;Trusted_Connection=True;MultipleActiveResultSets=true" } - デバッグ実行でログインすると、Error 4060(Cannot open database… The login failed) や RetryLimitExceededException が発生。
結論:テンプレートは「接続先」と「マイグレーション」を用意するだけで、実体のデータベースは自動作成しません。最初に Update-Database(または dotnet ef database update)を実行してスキーマを適用し、LocalDB インスタンスを起動しておく必要があります。
最短で直す:チェックリスト(まずはここから)
| 手順 | 内容 | 備考・補足 |
|---|---|---|
| 1 | LocalDB の存在確認sqllocaldb info を実行し、(localdb)\mssqllocaldb が一覧にあるか確認。なければ SQL Server Express(LocalDB 含む)をインストール。 | Visual Studio を入れていれば同梱されていることが多い。 |
| 2 | インスタンス起動sqllocaldb start mssqllocaldb を実行。 | 起動していないと接続失敗(エラー 26/50 など)になりやすい。 |
| 3 | データベースを作成(最重要) Visual Studio の パッケージ マネージャー コンソールで Update-Database を実行。 | これが初回作成+スキーマ適用を行う。Migrations がない場合は後述の「マイグレーション作成」を参照。 |
| 4 | 接続確認 SQL Server Object Explorer(VS)や SSMS で (localdb)\mssqllocaldb に接続し、対象 DB と AspNetUsers などのテーブルがあるか確認。 | DB が見えれば接続は問題ない。なければ手順 3 を再確認。 |
| 5 | アプリ設定の確認 Program.cs の AddDbContext<ApplicationDbContext> が UseSqlServer(connectionString) を指し、Identity が AddEntityFrameworkStores<ApplicationDbContext>() になっていることを確認。 | テンプレート生成のままで基本 OK。 |
| 6 | 詳細調査(必要時) 開発限定で EnableSensitiveDataLogging() を一時付与して内部例外や SQL を確認。 | 解決後は必ず無効化。ログに機密が出るため。 |
なぜ起きるのか:Error 4060 と RetryLimitExceeded の正体
Error 4060 は「指定したデータベースを開けない」エラーです。多くは DB が存在しない/名前が違う 場合に発生します。テンプレートが用意するのは接続文字列とマイグレーションだけなので、Update-Database を実行して実際の DB を作らない限り、この状態に陥ります。
RetryLimitExceededException は、接続やコマンドが失敗し続けてリトライ回数を超過したときに EF Core が投げる例外です。根本原因(未作成 DB、LocalDB 未起動、接続文字列のミス)を直せば解消します。
手順詳細:ゼロから正常動作まで
LocalDB の導入と起動
Windows 環境であれば、コマンド プロンプトや PowerShell で次を実行します。
sqllocaldb info
sqllocaldb create mssqllocaldb
sqllocaldb start mssqllocaldb
info に mssqllocaldb が表示され、start 実行後に Running になっていれば準備完了です。存在しない場合は作成(create)してから起動します。
接続文字列(appsettings.json)の確認
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-BlazorWebWithIdentity-XXXX;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=True"
}
}
Server=(localdb)\\mssqllocaldb… 既定の LocalDB インスタンス。Database=…… プロジェクト固有の DB 名。ここがズレると 4060 が出ます。Trusted_Connection=True… Windows 認証。TrustServerCertificate=True… ローカル開発では付けておくと TLS 周りの警告回避に便利(本番では必ず適切な証明書を使用)。
appsettings.Development.json に上書きする形でも OK です。ユーザーシークレットを使う場合は次のように設定できます。
dotnet user-secrets init
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "Server=(localdb)\\mssqllocaldb;Database=aspnet-...;Trusted_Connection=True;MultipleActiveResultSets=true"
マイグレーションの適用(初回作成)
テンプレートには通常 Migrations フォルダーが含まれています。Visual Studio の パッケージ マネージャー コンソールで次を実行します。
Update-Database
CLI 派なら(dotnet-ef を入れて)次でも同じです。
dotnet tool install --global dotnet-ef
dotnet ef database update
もし Migrations が存在しなければ、先に作成します。
dotnet ef migrations add InitialCreate -c ApplicationDbContext
dotnet ef database update
Program.cs の確認ポイント
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services
.AddDefaultIdentity(options => { /* パスワード規則など */ })
.AddEntityFrameworkStores();
var app = builder.Build();
// 以下、通常のパイプライン設定
Identity 用の ApplicationDbContext と接続文字列の紐づけ、AddEntityFrameworkStores が正しく設定されているかを確認します。
作成できたかを目視確認
Visual Studio の SQL Server Object Explorer または SSMS で (localdb)\mssqllocaldb に接続し、対象 DB 配下に AspNetUsers、AspNetRoles などのテーブルが生成されていれば成功です。
この手順で解消する典型エラーと対応早見表
| エラー内容 | 主な原因 | 対処 |
|---|---|---|
| Cannot open database … requested by the login. The login failed.(Error 4060) | DB 未作成、DB 名の誤り、接続先インスタンスの誤り | Update-Database を実行/接続文字列と DB 名を見直し |
| RetryLimitExceededException | 上記エラーの連続失敗、LocalDB 未起動、ネットワーク不通 | 根本原因を修正(LocalDB 起動、DB 作成、接続見直し) |
| A network-related or instance-specific error occurred(エラー 26/50 等) | LocalDB インスタンス停止/存在しない | sqllocaldb start mssqllocaldb/作成して起動 |
| Login failed for user …(エラー 18456) | SQL 認証を使っている・権限不足 | LocalDB は Windows 認証前提。接続文字列を Trusted_Connection=True に戻す |
| There is already an object named … | マイグレーションの不整合 | 最新状態に合わせてマイグレーションを整理し、再度 Update-Database |
実務で役立つ「原因の切り分け」テクニック
1. 接続文字列の誤りを 60 秒で見破る
- DB 名の末尾(GUID 部分)をプロジェクト名と照合。
- コピペ時のバックスラッシュに注意:
(localdb)\\mssqllocaldb(JSON ではエスケープが必要)。 - appsettings.Development.json → appsettings.json の上書き関係を確認(
EnvironmentNameの違いに注意)。
2. LocalDB の状態を確認する 4 コマンド
sqllocaldb info mssqllocaldb
sqllocaldb start mssqllocaldb
sqllocaldb stop mssqllocaldb
sqllocaldb delete mssqllocaldb
壊れたと感じたら stop → delete → create → start で再作成するのが早いです。
3. マイグレーションの健康診断
dotnet ef migrations list
dotnet ef database update
dotnet ef migrations add RenameXxx
「Migrations はあるが DB が古い」状態では list で現在地を把握し、最新へ update。
クロスプラットフォーム注意点:LocalDB は Windows 限定
LocalDB は Windows 専用です。macOS / Linux では同じ接続文字列では動作しません。次のいずれかを選択します。
- Docker の SQL Server を使う(推奨)。例:
Server=localhost,1433;Database=aspnet-BlazorWebWithIdentity;User Id=sa;Password=Your_strong_password_123;TrustServerCertificate=True - SQLite に切り替え(開発限定)。
UseSqliteへ変更し、マイグレーションを作り直す。
チーム開発では 環境ごとに接続先を切り替えるのが定石です(appsettings.<Environment>.json/ユーザーシークレット/環境変数)。
本番を見据えた設計:LocalDB は開発用に限定する
- 本番では Azure SQL / SQL Server などのマネージド/常設インスタンスへ移行。
- 接続暗号化、証明書、接続リトライ(
EnableRetryOnFailure)などの運用設定を検討。 - 接続文字列は Key Vault 等で安全に管理。appsettings.json へ直書きしない。
トラブルパターン別・深掘り対策
「Update‑Database したのに 4060」
- DB 名が 2 つ存在:プロジェクトをリネームした/テンプレートを作り直した等で古い DB が残っている。SQL Server Object Explorer で古い方を削除。
- 接続先が別インスタンス:
(localdb)\ProjectsV13などに向いている。mssqllocaldbへ統一。 - 権限エラー:別ユーザーで起動した LocalDB を参照。現在の Windows アカウントで再作成。
マイグレーションが壊れた気がする
やむを得ない場合は「DB をドロップ → マイグレーションをリセット → 再適用」で復旧します。
dotnet ef database drop -f
# 必要なら古い Migrations/*.cs をアーカイブしてから
dotnet ef migrations add ReInit -c ApplicationDbContext
dotnet ef database update
アプリ起動時に SQL 暗号化で警告が出る
開発では接続文字列に TrustServerCertificate=True を一時付与します。本番はサーバー側に正しい証明書を配備し、Encrypt=True で運用します。
複数 DbContext を使っている
Identity 用 ApplicationDbContext と業務データ用 AppDbContext を分けた場合、両方に対して マイグレーションと Update-Database を実行する必要があります。コンテキストを指定するには -c オプションを使います。
dotnet ef migrations add InitialIdentity -c ApplicationDbContext
dotnet ef database update -c ApplicationDbContext
dotnet ef migrations add InitialApp -c AppDbContext
dotnet ef database update -c AppDbContext
実装スニペット集(現場でそのまま使える)
DbContext の登録(開発時の詳細ログを一時有効化)
builder.Services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
#if DEBUG
options.EnableSensitiveDataLogging(); // 問題解決後に必ず外す
#endif
});
接続ヘルスチェック(起動時にフェイルファスト)
using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
// 接続可否チェック(失敗時は例外)
db.Database.CanConnect();
}
開発・本番で接続先を分ける appsettings 例
// appsettings.json(共通)
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-Dev;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=True"
}
// appsettings.Production.json(本番)
"ConnectionStrings": {
"DefaultConnection": "Server=tcp:prod-sql.database.windows.net,1433;Database=appdb;User Id=appuser;Password=<secret>;Encrypt=True;"
}
よくある質問(FAQ)
Q. Visual Studio が勝手に DB を作ってくれるのでは?
A. いいえ。テンプレートは マイグレーション を提供するだけで、DB 実体は作りません。初回に Update-Database が必要です。
Q. Migrations フォルダーが見当たりません
A. dotnet ef migrations add InitialCreate -c ApplicationDbContext で作成し、その後 dotnet ef database update で適用します。
Q. 接続文字列が長くて管理しづらい
A. 開発はユーザーシークレット、本番は環境変数/Key Vault を使って秘匿します。appsettings.json へ平文で置くのは避けましょう。
Q. ログイン後に突然エラーが出る
A. Cookie 認証設定、DataProtection キー、ApplicationUrl のポート変更など複合要因の可能性があります。まずは DB 接続とマイグレーションの整合性を最優先で確認してください。
付録:コマンド早見表
| 目的 | コマンド |
|---|---|
| LocalDB 一覧 | sqllocaldb info |
| LocalDB 作成 | sqllocaldb create mssqllocaldb |
| LocalDB 起動 | sqllocaldb start mssqllocaldb |
| LocalDB 停止 | sqllocaldb stop mssqllocaldb |
| LocalDB 削除 | sqllocaldb delete mssqllocaldb |
| EF:DB 作成/更新 | Update-Database / dotnet ef database update |
| EF:マイグレーション追加 | Add-Migration <名前> / dotnet ef migrations add <名前> |
| EF:既存 DB をドロップ | dotnet ef database drop -f |
| EF:マイグレーション一覧 | dotnet ef migrations list |
まとめ:最短復旧のコアは「DB を作る」こと
Blazor(.NET 9)× Identity で LocalDB 接続に失敗したら、LocalDB の起動とマイグレーション適用(Update‑Database)の 2 点をまず確認してください。テンプレートは便利ですが、実体 DB の作成だけは開発者の操作が必要です。これさえ押さえれば、Error 4060/RetryLimitExceededException の多くは数分で解消できます。以後はマイグレーションの整合性を保ちつつ、環境ごとに接続先を適切に切り替え、開発・本番の運用を安定させていきましょう。

コメント