Web Config&EF6&DbFirst&Oracle - 无法将OracleConnection转换为SqlConnection

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web Config&EF6&DbFirst&Oracle - 无法将OracleConnection转换为SqlConnection相关的知识,希望对你有一定的参考价值。

我正在使用EF 6,采用数据库优先方法和Oracle。但是,在连接时,会抛出以下异常:

无法将“Oracle.ManagedDataAccess.Client.OracleConnection”类型的对象强制转换为“System.Data.SqlClient.SqlConnection”类型

我有点困惑......

我的web.config看起来实际上是正确的:

<configuration>
    <configSections>    
        <section name="entityFramework" 
            type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
            requirePermission="false" />
        <section name="oracle.manageddataaccess.client" 
                 type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </configSections>
    <connectionStrings>
        <add name="TestConnection"
             providerName="System.Data.EntityClient"
             connectionString="metadata=res://*/Model.Entities.PimEntities.csdl|res://*/Model.Entities.PimEntities.ssdl|res://*/Model.Entities.PimEntities.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;data source=TestDataSource;persist security info=True;user id=XXX;password=XXX&quot;" />
    </connectionStrings>
    <system.data>
        <DbProviderFactories>
            <remove invariant="Oracle.DataAccess.Client" />
            <remove invariant="Oracle.ManagedDataAccess.Client" />

            <add name="ODP.NET, Managed Driver" 
                 invariant="Oracle.ManagedDataAccess.Client" 
                 description="Oracle Data Provider for .NET, Managed Driver" 
                 type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342" />
        </DbProviderFactories>
    </system.data>
    <entityFramework>
        <defaultConnectionFactory type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory, Oracle.ManagedDataAccess.EntityFramework" />
        <providers>
            <provider invariantName="System.Data.SqlClient" 
                      type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
            <provider invariantName="Oracle.ManagedDataAccess.Client" 
                      type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342" />
        </providers>
    </entityFramework>
    <oracle.manageddataaccess.client>
        <version number="*">
            <dataSources>
                <dataSource alias="TestDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=TestServer.TestDomain.loc)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=TestService))) " />
            </dataSources>
            <settings>
                <setting name="BindByName" value="true" />
            </settings>
        </version>
    </oracle.manageddataaccess.client>
</configuration>

为了确保我检查了我的DbContext课程:

public partial class TestEntities : DbContext
{
    public DbSetProvider() : base("name=TestConnection")
    {
    }
}

似乎是合法的。

经过几个小时的研究,我刚刚创建了一个新的Web应用程序,导入了特定的nuget包,并使用代码优先方法设置了ef,而不生成.edmx文件。

这按预期工作。

代码第一种方法使用的web.config与之前相同,除了:

<add name="TestConnection" 
     providerName="Oracle.ManagedDataAccess.Client" 
     connectionString="User Id=XXX;Password=XXX;Data Source=TestDataSource" />

现在我完成了。

除了providerName,当然还有元数据信息,没有任何改变。

所以我的问题是:为什么实体框架试图将OracleConnection转换为SqlConnection

或者如何解决我的问题并使用数据库优先方法?

请原谅我不完美的英语技能。

提前致谢。

答案

根据文档here,您的连接字符串providerName应该是Oracle的:

providerName="Oracle.ManagedDataAccess.Client"

不是providerName="System.Data.EntityClient"

以上是关于Web Config&EF6&DbFirst&Oracle - 无法将OracleConnection转换为SqlConnection的主要内容,如果未能解决你的问题,请参考以下文章

VS2015+MySql+EF6采坑经验总结

将EF项目从dbfirst转化为codefirst

DB First,ASP Net Core 2.1,EF6:InvalidOperationException:在应用程序配置文件中找不到名为“DataContext”的连接字符串

[EF]vs15+ef6+mysql code first方式

无法首先在表 ef6 db 中插入标识列的显式值

如何从实体框架 4 升级到 EF6?