基于 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="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 程序集。