.NET と Entity Framework Core を使用して Azure SQL Database に接続してクエリを実行する

適用対象:Azure SQL Database

このクイックスタートでは、.NET と Entity Framework Core を使用して Azure SQL Database 内のデータベースにアプリケーションを接続し、クエリを実行する方法について説明します。 このクイックスタートでは、データベースに接続するための推奨されるパスワードレス アプローチに従います。 パスワードレス接続について詳しくは、パスワードレス ハブに関する記事を参照してください。

前提条件

データベース サーバーを構成する

Azure SQL Database への安全なパスワードレス接続には、特定のデータベース構成が必要です。 Azure の論理サーバーで次の設定を確認し、ローカル環境とホスト環境の両方で Azure SQL Database に適切に接続します。

  1. ローカル開発の接続の場合は、ローカル コンピューターの IP アドレスやその他の Azure サービスで接続できるように論理サーバーが構成されていることを確認します。

    • お使いのサーバーの [ネットワーク] ページに移動します。

    • [選択されたネットワーク] ラジオ ボタンを切り替えて、追加の構成オプションを表示します。

    • [Add your client IPv4 address(xx.xx.xx.xx)] (クライアント IPv4 アドレスの追加 (xx.xx.xx.xx)) を選び、ローカル コンピューターの IPv4 アドレスからの接続を有効にするファイアウォール規則を追加します。 または、[+ Add a firewall rule] (ファイアウォール規則の追加) を選び、選んだ特定の IP アドレスを入力することもできます。

    • [Azure サービスおよびリソースにこのサーバーへのアクセスを許可する] チェックボックスがオンになっていることを確認します。

      A screenshot showing how to configure firewall rules.

      警告

      [Azure サービスおよびリソースにこのサーバーへのアクセスを許可する] 設定を有効にすることは、運用環境のシナリオでは推奨されるセキュリティ プラクティスではありません。 実際のアプリケーションでは、より強力なファイアウォール制限や仮想ネットワーク構成など、より安全なアプローチを実装する必要があります。

      データベース セキュリティの構成について詳しくは、次のリソースを参照してください。

  2. また、サーバーでは Microsoft Entra 認証が有効になっており、Microsoft Entra 管理者アカウントが割り当てられている必要があります。 ローカル開発接続の場合、Microsoft Entra 管理者アカウントは、ローカルで Visual Studio または Azure CLI にログインできるアカウントである必要があります。 論理サーバーの Microsoft Entra ID ページで、サーバーで Microsoft Entra 認証が有効になっているかどうかを確認できます。

    A screenshot showing how to enable Microsoft Entra authentication.

  3. 個人の Azure アカウントを使用している場合は、アカウントをサーバー管理者として割り当てるために、Microsoft Entra がセットアップされ、Azure SQL Database 用に構成されていることを確認してください。企業アカウントを使用している場合は、Microsoft Entra ID がおそらくすでに構成済みになっています。

プロジェクトを作成する

このセクションの手順では、.NET CLI または Visual Studio 2022 のいずれかを使用して、.NET の最小限の Web API を作成します。

  1. Visual Studio のメニュー バーで、[ファイル]>[新規]>[プロジェクト...] の順に移動します。

  2. ダイアログ ウィンドウで、プロジェクト テンプレートの検索ボックスに「ASP.NET」と入力し、ASP.NET Core Web API の結果を選択します。 ダイアログの下部にある [次へ] を選択します。

  3. [プロジェクト名] に「DotNetSQL」と入力します。 残りのフィールドは既定値のままにし、[次へ] を選択します。

  4. [フレームワーク] では、[.NET 7.0] を選択し、[コントローラーを使用する (最小限の API を使用する場合はオフにします)] をオフにします。 このクイックスタートでは、最小限の API テンプレートを使用して、エンドポイントの作成と構成を合理化します。

  5. [作成] を選択します。 新しいプロジェクトが Visual Studio 環境内で開きます。

プロジェクトに Entity Framework Core を追加する

.NET と Entity Framework Core を使用して Azure SQL Database に接続するには、次のいずれかの方法を使用して、3 つの NuGet パッケージをプロジェクトに追加する必要があります。

  1. [ソリューション エクスプローラー] ウィンドウで、プロジェクトの [依存関係] ノードを右クリックし、[NuGet パッケージの管理] を選択します。

  2. 表示されたウィンドウで、「EntityFrameworkCore」を検索します。 次のパッケージを見つけてインストールします。

  • Microsoft.EntityFrameworkCore: Entity Framework Core の必須機能を提供します
  • Microsoft.EntityFrameworkCore.SqlServer: 論理サーバーに接続するための追加コンポーネントを提供します
  • Microsoft.EntityFrameworkCore.Design: Entity Framework の移行を実行するためのサポートを提供します

または、[パッケージ マネージャー コンソール] ウィンドウで Install-Package コマンドレットを実行することもできます。

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Design

Azure SQL Database に接続するコードを追加する

Entity Framework Core ライブラリは、Azure SQL Database へのパスワードレス接続を実装するために、Microsoft.Data.SqlClient ライブラリと Azure.Identity ライブラリに依存します。 Azure.Identity ライブラリには、Azure へのパスワードレス認証を処理する、DefaultAzureCredential というクラスが用意されています。

DefaultAzureCredential では複数の認証方法がサポートされており、実行時にどれを使うかが決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカルと運用環境) で異なる認証方法をアプリに使用できます。 Azure ID ライブラリの概要に関する記事では、DefaultAzureCredential が資格情報を検索する順序と場所について説明されています。

Entity Framework Core と基になる DefaultAzureCredential クラスを使用して Azure SQL Database に接続するには、次の手順を実行します。

  1. 次のコードと一致するように、ConnectionStrings セクションを appsettings.Development.json ファイルに追加します。 <your database-server-name><your-database-name> のプレースホルダーを忘れずに更新してください。

    パスワードレスの接続文字列には、Authentication=Active Directory Default という構成値が含まれています。これにより、Entity Framework Core で、Azure サービスへの接続に DefaultAzureCredential が使用できるようになります。 アプリをローカルで実行するときは、Visual Studio へのサインインに使用しているユーザーで認証されます。 アプリが Azure にデプロイされると、同じコードで、ホストされるアプリに関連付けられているマネージド ID が検出され、適用されます。これは後で構成します。

    注意

    パスワードレスの接続文字列は、ソース管理にコミットしても安全です。ユーザー名、パスワード、アクセス キーなどのシークレットが含まれていないためです。

    {
        "Logging": {
            "LogLevel": {
                "Default": "Information",
                "Microsoft.AspNetCore": "Warning"
            }
        },
        "ConnectionStrings": {
            "AZURE_SQL_CONNECTIONSTRING": "Data Source=passwordlessdbserver.database.windows.net;
                Initial Catalog=passwordlessdb; Authentication=Active Directory Default; Encrypt=True;"
        }
    }
    
  2. var app = builder.Build(); を読み取るコード行の上にある Program.cs ファイルに、次のコードを追加します。 このコードでは、次の構成を実行します。

    • ローカル開発については appsettings.Development.json ファイルから、ホストされた運用シナリオについては環境変数から、パスワードレス データベース接続文字列を取得します。

    • Entity Framework Core の DbContext クラスを、.NET 依存関係挿入コンテナーに登録します。

      var connection = String.Empty;
      if (builder.Environment.IsDevelopment())
      {
          builder.Configuration.AddEnvironmentVariables().AddJsonFile("appsettings.Development.json");
          connection = builder.Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING");
      }
      else
      {
          connection = Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING");
      }
      
      builder.Services.AddDbContext<PersonDbContext>(options =>
          options.UseSqlServer(connection));
      
  3. 次のエンドポイントを app.Run() の上にある Program.cs ファイルの一番下に追加し、PersonDbContext クラスを使用してデータベースに対してエンティティの取得と追加を行います。

    app.MapGet("/Person", (PersonDbContext context) =>
    {
        return context.Person.ToList();
    })
    .WithName("GetPersons")
    .WithOpenApi();
    
    app.MapPost("/Person", (Person person, PersonDbContext context) =>
    {
        context.Add(person);
        context.SaveChanges();
    })
    .WithName("CreatePerson")
    .WithOpenApi();
    

    最後に、Person クラスと PersonDbContext クラスを、Program.cs ファイルの一番下に追加します。 Person クラスは、データベースの Persons テーブル内の 1 つのレコードを表します。 PersonDbContext クラスは Person データベースを表し、それに対してコードを使用して操作を実行できます。 DbContext の詳細については、Entity Framework Core の概要ドキュメントを参照してください。

    public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    
    public class PersonDbContext : DbContext
    {
        public PersonDbContext(DbContextOptions<PersonDbContext> options)
            : base(options)
        {
        }
    
        public DbSet<Person> Person { get; set; }
    }
    

移行を実行してデータベースを作成する

Entity Framework Core を使用してデータ モデルと一致するようにデータベース スキーマを更新するには、移行を使用する必要があります。 移行により、データベース スキーマを作成して増分更新し、アプリケーションのデータ モデルとの同期を保つことができます。 このパターンの詳細については、「移行の概要」を参照してください。

  1. プロジェクトのルートでターミナル ウィンドウを開きます。

  2. 次のコマンドを実行して、データベースを作成できる初期移行を生成します。

    Add-Migration InitialCreate
    
  3. Migrations フォルダーは、一意の番号が付加された InitialCreate というファイルと共に、プロジェクト ディレクトリに表示されます。 次のコマンドを使用して移行を実行し、データベースを作成します。

    Update-Database
    

    Entity Framework Core ツールにより、Azure に PersonDbContext クラスによって定義されたデータベース スキーマが作成されます。

アプリをローカルでテストする

アプリをローカルでテストする準備ができました。 データベースの管理者として設定したのと同じアカウントを使って、Visual Studio または Azure CLI にサインインしていることを確認します。

  1. Visual Studio の上部にある実行ボタンを押して、API プロジェクトを起動します。

  2. Swagger UI ページで、POST メソッドを展開し、[テスト] を選択します。

  3. 姓と名の値を含むようにサンプル JSON を変更します。 [実行] を選択して、新しいレコードをデータベースに追加します。 API は正常な応答を返します。

    A screenshot showing how to test the API.

  4. Swagger UI ページで GET メソッドを展開し、[テスト] を選択します。 [実行] を選択すると、先ほど作成した人物が返されます。

Azure App Service にデプロイする

アプリを Azure にデプロイする準備ができました。 Visual Studio によって、1 つのワークフローで Azure アプリ サービスを作成し、アプリケーションをデプロイできます。

  1. アプリが停止していることと、正常にビルドされていることを確認します。

  2. Visual Studio の [ソリューション エクスプローラー] ウィンドウで、最上位レベルのプロジェクト ノードを右クリックし、[発行] を選択します。

  3. 発行ダイアログで、デプロイ ターゲットとして [Azure] を選んでから、[次へ] を選択します。

  4. 具体的なターゲットとしては、[Azure App Service (Windows)] を選択し、[次へ] を選択します。

  5. 緑色の [+] アイコンを選択して、デプロイ先となる新しいアプリ サービスを作成し、次の値を入力します。

    • 名前: 既定値のままにします。

    • サブスクリプション名: デプロイするサブスクリプションを選択します。

    • [リソース グループ]: [新規] を選択し、msdocs-dotnet-sql という名前の新しいリソース グループを作成します。

    • [ホスティング プラン]: [新規] を選択して、ホスティング プラン ダイアログを開きます。 既定値のままにして [OK] を選択します。

    • [作成] 選択して、元のダイアログを閉じます。 Visual Studio によって、Azure に App Service リソースが作成されます。

      A screenshot showing how to deploy with Visual Studio.

  6. リソースが作成されたら、それがアプリ サービスの一覧で選択されていることを確認してから、[次へ] を選択します。

  7. [API Management] の手順で、下部にある [この手順をスキップする] チェックボックスをオンにし、[完了] を選択します。

  8. 発行プロファイルの概要の右上にある [発行] を選択して、アプリを Azure にデプロイします。

デプロイが完了すると、Visual Studio によってブラウザーが起動され、ホストされているアプリが表示されますが、この時点ではアプリは Azure で正しく動作しません。 データを取得するために、App Service と SQL データベースの間にセキュリティで保護された接続を構成する必要があります。

App Service を Azure SQL Database に接続する

App Service インスタンスを Azure SQL Database に接続するには、次の手順が必要です。

  1. App Service 用のマネージド ID を作成します。 アプリに含まれている Microsoft.Data.SqlClient ライブラリによって、マネージド ID が自動的に検出されます。ローカルの Visual Studio ユーザーが検出されたときと同様です。
  2. SQL データベース ユーザーを作成し、App Service のマネージド ID に関連付けます。
  3. 読み取り、書き込み、場合によってはその他のアクセス許可を付与する SQL ロールをデータベース ユーザーに割り当てます。

これらの手順を実施するために使用できるツールは複数あります。

Service Connector は、Azure のさまざまなサービス間の認証された接続を合理化するツールです。 現在、Service Connector では、Azure CLI 経由で az webapp connection create sql コマンドを使って、App Service を SQL データベースに接続することがサポートされています。 この 1 つのコマンドによって、上記の 3 つの手順が完了します。

az webapp connection create sql
-g <your-resource-group>
-n <your-app-service-name>
--tg <your-database-server-resource-group>
--server <your-database-server-name>
--database <your-database-name>
--system-identity

Service Connector によって行われた変更は、App Service の設定で確認できます。

  1. App Service の [ID] ページに移動します。 [システム割り当て済み] タブで、[状態][オン] に設定されているはずです。 この値は、システム割り当てマネージド ID がアプリに対して有効になっていたことを意味します。

  2. App Service リソースの [構成] ページに移動します。 [接続文字列] タブに、AZURE_SQL_CONNECTIONSTRING という名前の接続文字列が表示されているはずです。 [Click to show value] (クリックして値を表示にする) のテキストを選択すると、生成されたパスワードレスの接続文字列が表示されます。 この接続文字列の名前は、アプリで構成したものと一致するため、Azure で実行すると自動的に検出されます。

重要

このソリューションでは簡単な方法で開始できますが、これはエンタープライズ運用環境向けのベスト プラクティスではありません。 それらのシナリオでは、アプリが 1 つの昇格された ID を使用して、すべての操作を実行するべきではありません。 特定のタスクのための特定のアクセス許可を持つ複数の ID を構成することで、最小限の特権の原則を実装できるようにする必要があります。

データベース ロールとセキュリティの構成について詳しくは、次のリソースを参照してください。

チュートリアル:Azure SQL Database 内のデータベースをセキュリティで保護する

SQL Database へのデータベース アクセスを承認する

デプロイされたアプリケーションをテストする

アプリの URL を参照して、Azure SQL Database への接続が動作していることをテストします。 アプリの URL は、App Service の概要ページで確認できます。 URL の末尾に /person パスを追加して、ローカルでテストしたのと同じエンドポイントを参照します。

ローカルで作成した人物がブラウザーに表示されるはずです。 おめでとうございます。 これで、ローカル環境とホスト環境の両方で、アプリケーションを Azure SQL Database に接続することができました。

リソースのクリーンアップ

Azure SQL Database の操作が完了したら、意図しないコストを回避するためにリソースを削除します。

  1. Azure portal の検索バーで「Azure SQL」を検索し、一致する結果を選択します。

  2. データベースの一覧でデータベースを見つけて選択します。

  3. Azure SQL Database の [概要] ページで、[削除] を選択します。

  4. 開かれる [削除しますか...] ページで、データベースの名前を入力して確認し、[削除] を選択します。

次の手順