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="data source=server;initial catalog=mydb;integrated security=True;persist security info=True;"
providerName="System.Data.EntityClient"
/>
コードの変更
既存のソリューション内でこのプロバイダーを使用するには、(必要に応じて) いくつかのコード変更が必要です。
$
$
既存の SQL Server プロバイダーで System.Data.SqlClient
を使用するクラスとの競合を回避するために、以下のクラスの名前が変更されました。
$
$
$
$
$
$
$
既知の問題
.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 内にインストールしないでください。
.NET