初めに
公式チュートリアルに沿ってAzure SQL DatabaseにEntity Framework Coreを接続しようとした際に何点か詰まったポイントがあったため、他の方がハマらないように共有します。
凡ミスでハマってしまった部分もありますが最後までお付き合いいただけますと幸いです。
公式チュートリアル
1つ目のチュートリアルでAzure上にDBを作成して、2つ目のチュートリアルでそれに対してEntity Framework Coreからアクセスする構成になっています。
詰まりポイント① マイグレーションに失敗:その1
Entity Framework CoreからUpdate-Migration
を実行した際に以下のようなエラーが発生してしまいました。
An error occurred while accessing the Microsoft.Extensions.Hosting services. Continuing without the application service provider. Error: Failed to load configuration from file 'C:\Users\User\source\repos\DotNetSQL\DotNetSQL\appsettings.Development.json'.
Unable to create a 'DbContext' of type 'RuntimeType'. The exception 'Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[DotNetSQL.PersonDbContext]' while attempting to activate 'DotNetSQL.PersonDbContext'.' was thrown while attempting to create an instance. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
原因
公式のConnectionStringsの途中に改行が含まれておりをコピーペーストするとVisual Studioが勝手に「”」とか「,」とかを付け加えてしまう。そのせいで意図した文字列になっていなかった。
↓公式チュートリアルより
左:公式ページの文字列。右:公式ページのConnectionStringをVisual Studioでコピペしたときの文字列
解決策
一度別のテキストエディタなどに張り付けて1行にしてからコピペする。
詰まりポイント② マイグレーションに失敗:その2
DBをアップデートしようとしたら以下のエラーが発生した。
The ConnectionString property has not been initialized.
原因
詰まりポイント①の修正を試行錯誤しているうちに、誤って「Logging」配下にConnectionStringを配置してしまっていた。(完全に凡ミスです)
そのせいでConnectionStringにアクセスできなくなっていた。
解決策
エラーに遭遇しても落ち着いて作業する。
詰まりポイント③ Azure SQL Databaseへのマイグレーション失敗
DBアップデートを実施したところ下記エラーが出力された。
ClientConnectionId:xxxx-xxxx
DefaultAzureCredential failed to retrieve a token from the included credentials. See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/defaultazurecredential/troubleshoot
- EnvironmentCredential authentication unavailable. Environment variables are not fully configured. See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/environmentcredential/troubleshoot
- WorkloadIdentityCredential authentication unavailable. The workload options are not fully configured. See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/workloadidentitycredential/troubleshoot
- ManagedIdentityCredential authentication unavailable. No response received from the managed identity endpoint.
- Process "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\Asal\TokenService\Microsoft.Asal.TokenService.exe" has failed with unexpected error: TS003: Error, TS004: Unable to get access token. 'WAM Error
Error Code: 3399614467
Error Message: V2Error: invalid_grant AADSTS50020: User account '{XXXX Hidden}' from identity provider 'live.com' does not exist in tenant 'Microsoft Services' and cannot access the application 'xxxxxxxxxxx'(Visual Studio) in that tenant. The account needs to be added as an external user in the tenant first. Sign out and sign in again with a different Azure Active Directory user account. Trace ID: xxxxx Correlation ID: xxxxx Timestamp: 2024-12-02 12:54:55Z
Internal Error Code: 558133255
'.
- Azure CLI authentication failed due to an unknown error. See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/azclicredential/troubleshoot 'az' �́A�����R�}���h�܂��͊O���R�}���h�A
����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B
- Az.Accounts module >= 2.2.0 is not installed.
- Azure Developer CLI authentication failed due to an unknown error. Please visit https://aka.ms/azure-dev for installation instructions and then, once installed, authenticate to your Azure account using 'azd auth login'. 'azd' �́A�����R�}���h�܂��͊O���R�}���h�A
����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B
解決策
ConnectionStringをSQL認証用のものに変更したらうまくいった。
※公式チュートリアルではパスワードレスでやっていますがこのやり方だとパスワードを使用しています。
詰まりポイント④ パスワードレスで接続する方法
解決策
※おそらくこれ以外の方法もたくさんあります。+ベストプラクティスではないと思いますが初学者が手っ取り早くアプリとDBを接続する簡単な方法だと思います。
作成時にMicrosoft Entra 専用認証を使用するように設定する。
使用する接続文字列
補足 詰まりポイント③と④について
私と同じように初学者が詰まることを想定して、遭遇した順番に記載+その時とった対策をそのまま記載しました。そのため公式チュートリアルの意図と異なる方法になっているため補足を書きたいと思います。
Azure SQL Databaseの認証について。大きく分けるとDB作成の際に「SQL認証」と「Microsoft Entra認証」というものが選択できます。ざっくりいうと
- SQL認証:通常のユーザ名とパスワードを入力
- Microsoft Entra認証:パスワードレスで接続が可能
※Microsoft Entra認証についてもっといろいろありますが長くなってしまうので省略させていただきます。「ざっくりそんな感じ」ととらえてください。
そして使用するAzure SQL Databaseを作成する手順では「SQL認証」を設定してDBを作成しました。
ただしAsp.net Coreの際にはパスワードレスで接続するため「Microsoft Entra認証」のほうを使用しています。手順の「データベース サーバーを構成する」の部分で「Microsoft Entra認証」で接続できるようにDBを変更しているのですが私の環境ではうまくいっていませんでした。
そのためDBマイグレーションの際に認証がうまくいかずエラーが発生したと考えられます。そのことに作業中の私が気づくことができず、以下のような流れで修正しました。
「う~ん、DBマイグレーションうまくいかないな~。」
↓
「せや!ADO.NET (SQL 認証)って書いてある接続文字列をそのまま使ってみたらどうなるやろ?」
↓
「えっ?うまくいった。。。?そういえばAzure SQL Databaseを作るときに認証はSQL認証で作ったな。。。」
↓
「ということはAzure SQL Databaseを作るときにMicrosoft Entra認証を選択してADO.NET (パスワードレス認証Microsoft Entra)の接続文字列を使ったらうまくいくのでは。。?」
↓
「うまくいった!!!」
そのためAzure専門家の方々からするとツッコミどころがあるかもしれませんが多めに見ていただけますと幸いです。
おわりに
Azure SQL Databaseに接続する際の詰まりポイントとその対策方法をまとめてみました。
いろいろ試行錯誤して1週間くらいかかりました。。。
この記事が皆様のコーディングライフの助けになれば幸いです!
参考