基于 Microsoft.Data.SqlClient 的实体框架 6 SQL Server 提供程序

此实体框架 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中获取此包的最新版本

配置

可通过多种方式配置实体框架以使用此提供程序。

可以使用属性通过代码注册提供程序:

[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" >

要将 EDMX 文件与 Visual Studio 设计器配合使用,必须将提供程序名称切换回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" 
 />

代码更改

要在现有解决方案中使用提供程序,需要进行一些代码更改(根据需要)。

%>

%>

已重命名以下类,以避免与在现有的 SQL Server 提供程序中使用System.Data.SqlClient的类冲突:

%>

%>

%>

%>

%>

%>

%>

已知问题

使用 .NET Framework 和连接字符串配置Azure 应用服务

如果将 Azure 应用服务与 .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。 不应在 GAC 中安装 EF6 程序集。