EF6迁移至Microsoft.Data.SqlClient时SqlParameter转换异常求助
EF6迁移至Microsoft.Data.SqlClient时SqlParameter类型不匹配异常的解决思路
异常原因
这个InvalidCastException本质是EF6的DbContext仍绑定旧的System.Data.SqlClient组件,导致无法识别Microsoft.Data.SqlClient.SqlParameter——两个类同名但分属不同程序集,类型不兼容。
解决步骤
替换默认连接工厂
原web.config中使用的SqlConnectionFactory基于System.Data.SqlClient,需替换为适配Microsoft.Data.SqlClient的实现:<!-- 原配置 --> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <!-- 修改后配置 --> <defaultConnectionFactory type="Microsoft.EntityFramework.SqlServer.MicrosoftSqlConnectionFactory, Microsoft.EntityFramework.SqlServer" />修正连接字符串的ProviderName
确保连接字符串的providerName指定为Microsoft.Data.SqlClient,而非旧的System.Data.SqlClient:<connectionStrings> <add name="MyContext" connectionString="Data Source=...;Initial Catalog=...;Integrated Security=True;" providerName="Microsoft.Data.SqlClient" /> </connectionStrings>确认DbConfiguration全局生效
虽然已添加[DbConfigurationType(typeof(MicrosoftSqlDbConfiguration))]特性,需确保:MicrosoftSqlDbConfiguration来自Microsoft.EntityFramework.SqlServer命名空间- 项目中没有其他全局DbConfiguration初始化代码覆盖该设置(比如
DbConfiguration.SetConfiguration()的调用)
检查程序集版本兼容性
确保以下包版本匹配:- EF6版本为6.5.1
Microsoft.EntityFramework.SqlServer版本与EF6一致(建议6.5.1)Microsoft.Data.SqlClient版本需与Microsoft.EntityFramework.SqlServer兼容(推荐4.x或5.x系列)
临时兼容方案(可选)
若配置修改后仍未生效,可临时使用EF原生的ObjectParameter规避类型问题:Context.Database .SqlQuery<int>(sql, new System.Data.Entity.Core.Objects.ObjectParameter("@userName", userName)).First();
核心逻辑
让EF6的所有核心组件(连接工厂、数据提供者、配置类)完全切换到Microsoft.Data.SqlClient的实现,确保参数类型、连接对象等全链路兼容。
内容的提问来源于stack exchange,提问作者cvb
相关产品推荐
相关产品推荐

