Проблемы при переключении проекта.NET с неуправляемых сборок на ODP.NET

Я пытаюсь переключить свой проект.NET на оракул управления, чтобы упростить развертывание. Однако я получаю следующую ошибку в моей тестовой среде Win Server 2013:

Невозможно определить имя поставщика для подключения типа "Oracle.ManagedDataAccess.Client.OracleConnection".

Шаги, которые я предпринял до сих пор:

  1. Удалены все библиотеки Oracle.DataAccess и ссылки из решения.
  2. Добавлен управляемый драйвер поставщика данных Oracle для.NET (ODP.NET) в диспетчере пакетов NuGet
  3. Переключил все Imports Oracle.DataAccess заявления к Imports Oracle.ManagedDataAccess

Я не получаю никаких ошибок сборки, и проект работает нормально локально. Однако при развертывании в среде тестирования я получаю эту ошибку. Среда тестирования - Windows Server 2012, на которой установлена ​​устаревшая клиентская программа Oracle 11.2.0.

Это мой код создания соединения:

Public Sub New()
    MyBase.New(
        New OracleConnection(
            ConfigurationManager.ConnectionStrings("Entities").ConnectionString),
        True)
End Sub

Вот 3 различных стиля конфигурации соединения, которые я попробовал (оба работают локально, но дают ту же проблему в тестовой среде)

(отформатирован для наглядности)

  <add 
      name="Entities"
      connectionString="
          Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=###.###.###.###)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=______)));
          User Id=_____;
          Password=_____;"
      providerName="Oracle.ManagedDataAccess.Client" />

  <add 
      name="Entities"
      connectionString="
          Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=###.###.###.###)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=______)));
          User Id=_____;
          Password=_____;"
      providerName="Oracle.DataAccess.Client" />

  <add 
      name="Entities"
      connectionString="
          Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=###.###.###.###)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=______)));
          User Id=_____;
          Password=_____;"
   />

Любая помощь будет принята с благодарностью!

2 ответа

Метод ручной загрузки

Спасибо @Christian Shay за указание на то, что версия Managed ODAC для NuGet не является автором Oracle

Чтобы использовать управляемый доступ к данным Oracle с Entity Framework, в Visual Studio 2012 (.NET 4.5):

  1. Раскройте Entity Framework 5.0.0.0

    Install-Package EntityFramework -Version 5.0.0

  2. Загрузите последние компоненты доступа к данным Oracle (ODAC)

  3. Ручная ссылка Oracle.ManagedDataAccess.dll

  4. Добавьте этот раздел в файл конфигурации

  <system.data>
    <DbProviderFactories>
      <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.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>

А затем продолжайте как обычно. В настоящее время создается впечатление, что Entity Framework 6 еще не поддерживает Oracle.ManagedDataAccess, поэтому необходимо запустить версию 5.

Также имейте в виду, что если вы используете Visual Studio 2010 или более раннюю версию, ориентируясь на.NET 4, NuGet отключит EF5, но использует сборки 4.x. Я не проверял это на VS2010 с.NET 4.

Неофициальный метод NuGet

Чтобы использовать управляемый доступ к данным Oracle с Entity Framework, в Visual Studio 2012 (.NET 4.5):

  1. Раскройте Entity Framework 5.0.0.0

    Install-Package EntityFramework -Version 5.0.0

  2. Разверните управляемый драйвер поставщика данных Oracle для.NET (ODP.NET)

    Install-Package odp.net.managed

  3. Добавьте этот раздел в файл конфигурации

  <system.data>
    <DbProviderFactories>
      <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.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>

А затем продолжайте как обычно. В настоящее время создается впечатление, что Entity Framework 6 еще не поддерживает Oracle.ManagedDataAccess, поэтому необходимо запустить версию 5.

Также имейте в виду, что если вы используете Visual Studio 2010 или более раннюю версию, ориентируясь на.NET 4, NuGet отключит EF5, но использует сборки 4.x. Я не проверял это на VS2010 с.NET 4.

Другие вопросы по тегам