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="data source=TestDataSource;persist security info=True;user id=XXX;password=XXX"" />
</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"
我将 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="data source=TestDataSource;persist security info=True;user id=XXX;password=XXX"" />
</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"