如何让EF6与Microsoft.Data.SqlClient兼容运行?
我在.NET Framework 4.7.2环境下,用EF6和Microsoft.Data.SqlClient实现托管标识,web.config配置如下:
<connectionStrings> <add name="SCContext" providerName="Microsoft.Data.SqlClient" connectionString="Server=<myserver>;Authentication=Active Directory Default;Database=TestDB" /> </connectionStrings> <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>
代码里定义了DbContext和DbSet:
private MyContext _context; // MyContext继承自DbContext public DbSet<User> Users { get; set; }
但调用_context.Users.Find(<guid>);时抛出错误:
System.InvalidCastException: 'Unable to cast object of type 'Microsoft.Data.SqlClient.SqlConnection' to type 'System.Data.SqlClient.SqlConnection'.'
这个错误是因为EF6默认绑定旧版System.Data.SqlClient,而你配置了新版Microsoft.Data.SqlClient作为数据库驱动,两者类型不兼容导致转换失败。按以下步骤修复:
安装EF6兼容Microsoft.Data.SqlClient的NuGet包
安装EntityFramework.MicrosoftDataSqlClient包,这是EF6官方适配包,用于让EF6识别并使用Microsoft.Data.SqlClient。配置EF6使用Microsoft.Data.SqlClient提供程序
创建自定义DbConfiguration类,注册新版SqlClient服务:using System.Data.Entity; using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal; public class CustomDbConfig : DbConfiguration { public CustomDbConfig() { // 注册Microsoft.Data.SqlClient的提供服务 SetProviderServices(SqlClientFactory.Instance.InvariantName, SqlProviderServices.Instance); // 设置默认连接工厂为Microsoft.Data.SqlClient的工厂 SetDefaultConnectionFactory(new SqlConnectionFactory()); } }然后在你的DbContext上标记使用该配置:
[DbConfigurationType(typeof(CustomDbConfig))] public class MyContext : DbContext { public MyContext() : base("name=SCContext") { } public DbSet<User> Users { get; set; } }也可以在web.config中指定配置类:
<entityFramework codeConfigurationType="你的命名空间.CustomDbConfig, 你的程序集名称"> </entityFramework>清理冲突引用
检查项目依赖,确保没有同时引用System.Data.SqlClient和Microsoft.Data.SqlClient导致类型冲突。若没有其他组件依赖旧版SqlClient,可直接移除System.Data.SqlClient的引用。
完成以上步骤后,EF6就能正确使用Microsoft.Data.SqlClient的连接对象,不会再出现类型转换错误。
内容的提问来源于stack exchange,提问作者Sarah

