C#应用app.config同时配置SQL与Oracle EF提供程序后SQL连接报错
问题结论
同一个app.config文件完全支持同时配置SQL Server与Oracle两种数据库的EF提供程序,二者不存在互斥问题,你遇到的报错是EF匹配错误数据库提供程序导致的,并非多提供程序共存的限制。
报错原因
'Initial Catalog' is an invalid connection string attribute是Oracle数据库提供程序抛出的特征错误:Oracle连接字符串不识别Initial Catalog属性(Oracle指定服务名的关键字为DATA SOURCE/SERVICE_NAME),说明原本用于连接SQL Server的DbContext,被EF错误绑定到了Oracle提供程序上,根本没有执行SQL Server客户端的连接逻辑。
排查修复方案
- 检查EF默认连接工厂配置
安装Oracle的ODP.NET相关NuGet包时,安装脚本可能自动修改entityFramework配置段下的defaultConnectionFactory项,将原本的SQL Server默认工厂替换为Oracle连接工厂,导致所有未显式指定提供程序的连接默认走Oracle逻辑。如果你的默认连接场景是SQL Server,需要将该项改回SQL Server工厂配置:<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> - 所有连接字符串显式指定providerName
配置文件中的每一条数据库连接字符串都必须显式声明对应的提供程序名,不能省略该属性,也不能写反对应关系:- SQL Server连接串必须配置
providerName="System.Data.SqlClient" - Oracle连接串必须配置
providerName="Oracle.ManagedDataAccess.Client"
配置示例:
如果是通过代码构造DbContext,不要仅传入裸连接字符串,可以直接传入对应类型的数据库连接对象(传入<!-- SQL Server连接配置 --> <add name="SqlDbConn" connectionString="Data Source=你的SQL实例地址;Initial Catalog=目标库名;Integrated Security=True" providerName="System.Data.SqlClient" /> <!-- Oracle连接配置 --> <add name="OracleDbConn" connectionString="Data Source=你的Oracle服务地址;User Id=账号;Password=密码;" providerName="Oracle.ManagedDataAccess.Client" />SqlConnection实例会自动匹配SQL提供程序,传入OracleConnection实例会自动匹配Oracle提供程序),避免EF自动匹配提供程序时出错。 - SQL Server连接串必须配置
- 修正Oracle提供程序配置的语法错误
你当前贴出的Oracle提供程序配置存在语法错误,type属性中类名与程序集名之间缺少分隔逗号,会导致EF加载提供程序列表时顺序错乱,错误匹配提供程序。
错误配置片段:
修正后配置(在type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices Oracle.ManagedDataAccess.EntityFramework, Version=6.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342"EFOracleProviderServices后补逗号):type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342"
内容的提问来源于stack exchange,提问作者Dee
相关产品推荐
相关产品推荐

