以 Microsoft.Data.SqlClient 為基礎的 Entity Framework 6 SQL Server 提供者
此 Entity Framework 6 提供者是內建 SQL Server 提供者的替代提供者。
此提供者相依於新 式 Microsoft.Data.SqlClient ADO.NET 提供者,其中包括下列優點,優於目前使用的驅動程式:
- 目前用戶端收到完整支援,與
System.Data.SqlClient
相反,其處於維護模式 - 支援新的 SQL Server 功能,包括支援 SQL Server 2022 增強型用戶端通訊協定 (TDS8)
- 支援大部分的 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>
如果您使用 App.Config 搭配 .NET 6 或更新版本應用程式,則必須移除 <system.data>
上述區段,並在程式碼中註冊 DbProviderFactory 一次:
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"
/>
程式碼變更
若要在現有的方案中使用提供者,需要一些程式代碼變更(視需要)。
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 服務
如果您使用 Azure App 服務 搭配 .NET Framework 和 連接字串 組態功能,則可能會遇到執行時間問題,因為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 中。