You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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作为数据库驱动,两者类型不兼容导致转换失败。按以下步骤修复:

  1. 安装EF6兼容Microsoft.Data.SqlClient的NuGet包
    安装EntityFramework.MicrosoftDataSqlClient包,这是EF6官方适配包,用于让EF6识别并使用Microsoft.Data.SqlClient。

  2. 配置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>
    
  3. 清理冲突引用
    检查项目依赖,确保没有同时引用System.Data.SqlClient和Microsoft.Data.SqlClient导致类型冲突。若没有其他组件依赖旧版SqlClient,可直接移除System.Data.SqlClient的引用。

完成以上步骤后,EF6就能正确使用Microsoft.Data.SqlClient的连接对象,不会再出现类型转换错误。

内容的提问来源于stack exchange,提问作者Sarah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:52:41