共用方式為


以 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=&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 服務

如果您使用 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 中。