Web Config & EF 6 & Db First 和 Oracle - 无法将 OracleConnection 转换为 SqlConnection

WebConfig & EF 6 & DbFirst & Oracle - Unable cast OracleConnection to SqlConnection

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

Unable to cast object of type 'Oracle.ManagedDataAccess.Client.OracleConnection' to type '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 class:

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,当然还有元数据信息外,没有任何变化。

所以我的问题是:为什么 Entity Framework 试图将 OracleConnection 转换为 SqlConnection

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

请原谅我的英语水平不完善。

提前致谢。

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

providerName="Oracle.ManagedDataAccess.Client"

不是providerName="System.Data.EntityClient"