次の方法で共有


Microsoft.Data.SqlClient に基づく Entity Framework 6 SQL Server プロバイダー

この Entity Framework 6 プロバイダーは、組み込みの SQL Server プロバイダーの代替プロバイダーです。

このプロバイダーは、現代的な Microsoft.Data.SqlClient ADO.NET プロバイダーを利用しており、これには現在使用されているドライバーと比べて以下の長所が存在します。

  • メンテナンス モードに入る System.Data.SqlClient とは対照的に、現在のクライアントは完全なサポートを受けます
  • SQL Server 2022 エンハンスト クライアント プロトコル (TDS8) のサポートを含む、新しい SQL Server 機能をサポートします
  • ほとんどの Azure Active Directory 認証方法をサポートします
  • .NET での Always Encrypted をサポートします

このプロバイダーはランタイムのみの更新であり、既存の Visual Studio ツールでは動作しないことに注意してください。

このパッケージの最新のビルドは NuGet から入手できます

構成

このプロバイダーを使用するように Entity Framework を構成するには、さまざまな方法があります。

次の属性を使用して、コード内でプロバイダーを登録できます。

[DbConfigurationType(typeof(MicrosoftSqlDbConfiguration))]
public class SchoolContext : DbContext
{
    public SchoolContext() : base()
    {
    }

    public DbSet<Student> Students { get; set; }
}

ソリューションに DbContext を継承するクラスが複数ある場合は、DbConfigurationType 属性をそれらすべてに追加します。

または、以下のようにデータ アクセス呼び出しの前に SetConfiguration メソッドを使用することができます。

 DbConfiguration.SetConfiguration(new MicrosoftSqlDbConfiguration());

または、既存の派生 DbConfiguration クラスに以下の行を追加します。

SetProviderFactory(MicrosoftSqlProviderServices.ProviderInvariantName, Microsoft.Data.SqlClient.SqlClientFactory.Instance);
SetProviderServices(MicrosoftSqlProviderServices.ProviderInvariantName, MicrosoftSqlProviderServices.Instance);
// Optional
SetExecutionStrategy(MicrosoftSqlProviderServices.ProviderInvariantName, () => new MicrosoftSqlAzureExecutionStrategy());

以下のように App.Config ベースの構成を使用することもできます。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />    
    </configSections>
    <entityFramework>
        <providers>
            <provider invariantName="Microsoft.Data.SqlClient" type="System.Data.Entity.SqlServer.MicrosoftSqlProviderServices, Microsoft.EntityFramework.SqlServer" />
        </providers>
    </entityFramework>
    <system.data>
        <DbProviderFactories>
           <add name="SqlClient Data Provider"
             invariant="Microsoft.Data.SqlClient"
             description=".NET Framework Data Provider for SqlServer"
             type="Microsoft.Data.SqlClient.SqlClientFactory, Microsoft.Data.SqlClient" />
        </DbProviderFactories>
    </system.data>
</configuration>

.NET 6 以降のアプリで App.Config を使用する場合は、上記の <system.data> セクションを削除し、以下のように DbProviderFactory をコードに 1 回登録する必要があります。

DbProviderFactories.RegisterFactory(MicrosoftSqlProviderServices.ProviderInvariantName, Microsoft.Data.SqlClient.SqlClientFactory.Instance);

EDMX の使用方法

EDMX ファイルを使用する場合は、以下のように Provider の名前を更新します。

<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx">
  <edmx:Runtime>
    <edmx:StorageModels>
      <Schema Namespace="ChinookModel.Store" Provider="Microsoft.Data.SqlClient" >

Visual Studio デザイナーで EDMX ファイルを使用するには、プロバイダー名を System.Data.SqlClient に切り替え直す必要があります

また、EntityConnection 接続文字列内のプロバイダー名 (provider=Microsoft.Data.SqlClient) も更新します

 <add 
    name="Database" 
    connectionString="metadata=res://*/EFModels.csdl|res://*/EFModels.ssdl|res://*/EFModels.msl;provider=Microsoft.Data.SqlClient;provider connection string=&quot;data source=server;initial catalog=mydb;integrated security=True;persist security info=True;" 
    providerName="System.Data.EntityClient" 
 />

コードの変更

既存のソリューション内でこのプロバイダーを使用するには、(必要に応じて) いくつかのコード変更が必要です。

using System.Data.SqlClient; =>using Microsoft.Data.SqlClient;

using Microsoft.SqlServer.Server; =>using Microsoft.Data.SqlClient.Server;

既存の SQL Server プロバイダーで System.Data.SqlClient を使用するクラスとの競合を回避するために、以下のクラスの名前が変更されました。

SqlAzureExecutionStrategy =>MicrosoftSqlAzureExecutionStrategy

SqlDbConfiguration =>MicrosoftSqlDbConfiguration

SqlProviderServices =>MicrosoftSqlProviderServices

SqlServerMigrationSqlGenerator =>MicrosoftSqlServerMigrationSqlGenerator

SqlSpatialServices =>MicrosoftSqlSpatialServices

SqlConnectionFactory =>MicrosoftSqlConnectionFactory

LocalDbConnectionFactory =>MicrosoftLocalDbConnectionFactory

既知の問題

.NET Framework と接続文字列構成を使用する Azure App Service

.NET Framework と接続文字列構成機能と共に Azure App Service を使用する場合、このシナリオの ProviderName 接続文字列設定は System.Data.SqlClient にハードコーディングされるため、ランタイムの問題が発生する可能性があります。

解決策は、次のような派生 MicrosoftSqlDbConfiguration クラスを使用することです。

public class AppServiceConfiguration : MicrosoftSqlDbConfiguration
{
    public AppServiceConfiguration()
    {
        SetProviderFactory("System.Data.SqlClient", Microsoft.Data.SqlClient.SqlClientFactory.Instance);
        SetProviderServices("System.Data.SqlClient", MicrosoftSqlProviderServices.Instance);
        SetExecutionStrategy("System.Data.SqlClient", () => new MicrosoftSqlAzureExecutionStrategy());
    }
}

次に、上記のコードベース構成でこの派生クラスを使用します。

GAC にインストールされている EntityFramework.dll

.NET Framework GAC (グローバル アセンブリ キャッシュ) に古いバージョンの EntityFramework.dll がインストールされている場合は、次のエラーが発生する場合があります。

The 'PrimitiveTypeKind' attribute is invalid - The value 'HierarchyId' is invalid according to its datatype

解決策は、GAC から .dll を削除することです。 EF6 アセンブリは絶対に GAC 内にインストールしないでください。