.NET 9 Blazor Identity が LocalDB に接続できない(Error 4060/RetryLimitExceededException)原因と解決策まとめ

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 インスタンスを起動しておく必要があります。

最短で直す:チェックリスト(まずはここから)

手順内容備考・補足
1LocalDB の存在確認
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&lt;ApplicationDbContext&gt;(options =&gt;
{
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
#if DEBUG
    options.EnableSensitiveDataLogging(); // 問題解決後に必ず外す
#endif
});

接続ヘルスチェック(起動時にフェイルファスト)

using (var scope = app.Services.CreateScope())
{
    var db = scope.ServiceProvider.GetRequiredService&lt;ApplicationDbContext&gt;();
    // 接続可否チェック(失敗時は例外)
    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=&lt;secret&gt;;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 の多くは数分で解消できます。以後はマイグレーションの整合性を保ちつつ、環境ごとに接続先を適切に切り替え、開発・本番の運用を安定させていきましょう。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次