WebConfig & EF 6 & DbFirst & Oracle - Невозможно привести преобразование OracleConnection к SqlConnection - PullRequest
0 голосов
/ 14 сентября 2018

Я использую 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")
    {
    }
}

Кажется законным.

После нескольких часов исследований я только что создал новое веб-приложение, импортировал определенные пакеты 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?

Или как исправить мою проблему и использовать подход, основанный на базе данных?

Извините за мои несовершенные навыки английского языка.

Заранее спасибо.

1 Ответ

0 голосов
/ 14 сентября 2018

В соответствии с документами здесь , ваша строка поставщика имя_связи должна быть Oracle:

providerName="Oracle.ManagedDataAccess.Client"

, а не providerName="System.Data.EntityClient"

...