Развертывание и настройка ODP.NET для работы без установки с Entity Framework

Как развернуть и настроить ODP.NET для работы без установки с Entity Framework?

A. Как развернуть и настроить Oracle.DataAccess.Client?

B. Как развернуть и настроить Oracle.ManagedDataAccess.Client?

C. Что нужно сделать, чтобы сборки с EDMX с Oracle SSDL работали?

D. Что нужно установить для поддержки дизайнера?


person Danny Varod    schedule 05.12.2012    source источник


Ответы (2)


Этот ответ обобщает (надеюсь) все необходимые шаги, многие из которых задокументированы в разных местах в Интернете и могут сэкономить кому-то часы поиска в Google.

A. Как развернуть и настроить Oracle.DataAccess.Client.

А.1. Загрузите ODAC112030Xcopy_64bit.zip или ODAC112030Xcopy_32bit.zip.

А.1.1. Извлеките содержимое следующих папок из zip-файла в папку bin/setup вашего приложения/хоста:

А.1.1.1. мгновенный клиент_11_2

А.1.1.2. odp.net4\bin\

А.1.1.3. odp.net4\odp.net\bin\

А.1.1.4. odp.net4\odp.net\PublisherPolicy\4\

А.2. Добавьте следующий раздел в начало файла app.config/web.config вашего приложения/хоста (если у вас уже есть элемент configSections, добавьте в него раздел:

<configSections>
  <section name="oracle.dataaccess.client"
    type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>

А.3. Добавьте следующие разделы в конец файла app.config/web.config вашего приложения/хоста:

А.4. Из папки ODAC112030Xcopy выполните:

configure.bat odp.net4 somename

Я рекомендую использовать oraclehome112030_32 или oraclehome112030_64 в качестве имени выше.

<system.data>
  <DbProviderFactories>
    <!-- Remove in case this is already defined in machine.config -->
    <remove invariant="Oracle.DataAccess.Client" />
    <add name="Oracle Data Provider for .NET"
         invariant="Oracle.DataAccess.Client"
         description="Oracle Data Provider for .NET"
         type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
  </DbProviderFactories>
</system.data>

<oracle.dataaccess.client>
  <settings>
    <add name="bool" value="edmmapping number(1,0)" />
    <add name="byte" value="edmmapping number(3,0)" />
    <add name="int16" value="edmmapping number(5,0)" />
    <add name="int32" value="edmmapping number(10,0)" />
    <add name="int64" value="edmmapping number(19,0)" />
    <add name="int16" value="edmmapping number(38,0)" />
    <add name="int32" value="edmmapping number(38,0)" />
    <add name="int64" value="edmmapping number(38,0)" />
  </settings>
</oracle.dataaccess.client>




B. Как развернуть и настроить Oracle.ManagedDataAccess.Client.

Б.1. Загрузите ODP.NET_Managed_1120350_Beta.zip

Б.1.1. Извлеките следующие файлы в папку bin/setup вашего приложения/хоста.

Б.1.1.1. Oracle.ManagedDataAccess.dll

Б.1.1.2. x64\Oracle.ManagedDataAccessDTC.dll или x86\Oracle.ManagedDataAccessDTC.dll

БИ 2. Добавьте следующий раздел в начало файла app.config/web.config вашего приложения/хоста (если у вас уже есть элемент configSections, добавьте в него раздел:

<configSections>
  <section name="oracle.manageddataaccess.client"
    type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.112.3.50, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>

Б.3. Добавьте следующие разделы в конец файла app.config/web.config вашего приложения/хоста:

<system.data>
  <DbProviderFactories>
    <!-- Remove in case this is already defined in machine.config -->
    <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.112.3.50, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </DbProviderFactories>
</system.data>

<oracle.manageddataaccess.client>
  <version number="*">
    <settings>
      <!-- Set this path if you are using TNS aliases as connection strings (not recommended) -->
      <!-- Instead you can use "SERVER_NAME:PORT/SERVICE_NAME" as your data source -->
      <setting name="TNS_ADMIN" value="C:\"/>
    </settings>
    <edmMappings>
      <edmMapping dataType="number">
        <add name="bool" precision="1"/>
        <add name="byte" precision="2" />
        <add name="int16" precision="5" />
      </edmMapping>
    </edmMappings>
  </version>
</oracle.manageddataaccess.client>




C. Для строительства:

С.1. Добавьте этот раздел в app.config вашей сборки EDMX:

(Еще не пробовал это с Oracle.ManagedDataAccess.Client)

<oracle.dataaccess.client>
  <settings>
    <add name="bool" value="edmmapping number(1,0)" />
    <add name="byte" value="edmmapping number(3,0)" />
    <add name="int16" value="edmmapping number(5,0)" />
    <add name="int32" value="edmmapping number(10,0)" />
    <add name="int64" value="edmmapping number(19,0)" />
    <add name="int16" value="edmmapping number(38,0)" />
    <add name="int32" value="edmmapping number(38,0)" />
    <add name="int64" value="edmmapping number(38,0)" />
  </settings>
</oracle.dataaccess.client>

С.2. Добавьте в ту же сборку файл с именем Oracle.xsd с содержимым:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="odpnetappconfigmappings" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="addtype">
    <xs:attribute name="name" type="xs:string" />
    <xs:attribute name="value" type="xs:string" />
  </xs:complexType>

  <xs:complexType name="settingstype">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="add" type="addtype" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="oracledataaccessclienttype">
    <xs:sequence minOccurs="0" maxOccurs="1">
      <xs:element name="settings" type="settingstype" />
    </xs:sequence>
  </xs:complexType>

  <xs:element name="oracle.dataaccess.client" type="oracledataaccessclienttype" />

</xs:schema>

С.3. Добавьте приведенный выше XSD в приведенный выше список схем app.config.

С.4. Если вы получаете ошибки для логических сопоставлений во время сборки, даже если сборка выполняется успешно, добавьте сопоставления app.config в файл devenv.exe.config Visual Studio.

С.5. Если вы хотите использовать Oracle.ManagedDataAccess.Client, либо отредактируйте атрибут поставщика данных в EDMX вручную перед сборкой (я этого не пробовал), либо отредактируйте его до создания контекста во время выполнения и загрузите MSSL из отредактированной копии, а не из ресурс (похоже, это работает, и я также использую аналогичный прием, чтобы выбрать, какой MSSL загружать для разных поставщиков БД).




D. Для поддержки дизайнера:

Д.1. Загрузите win64_11gR2_client.zip или win32_11gR2_client.zip и установите.

Д.1.1. В качестве типа установки выберите «Администратор».

Д.2. загрузите ODT и установите.




Я попробовал это (A и B) на пустой машине (VM) с Windows 7 x64.

Эта процедура не работает с версией Oracle.DataAccess.Client x86 в Windows x64.

Эта процедура работает с 64-разрядной версией Oracle.DataAccess.Client в Windows x64 и с обеими версиями Oracle.ManagedDataAccess.Client.

person Danny Varod    schedule 05.12.2012
comment
Как подключиться к базе данных Oracle с помощью Entity Framework и управляемого драйвера ODP.NET? Может быть полезно forums.oracle.com/forums/ Больше информация об этом? - person Kiquenet; 04.04.2013
comment
@Kiquenet См. раздел B в моем ответе. Я пробовал это с бета-версией, и это вроде работало — запросы возвращали разные результаты. - person Danny Varod; 04.04.2013
comment
Управляемый клиент и EF работают вместе только частично. Бета 2 должна иметь лучшую поддержку. - person Tridus; 04.04.2013
comment
Вот две вещи, которые следует учитывать: 1) мне пришлось скопировать эти дополнительные библиотеки DLL в мою папку bin ASP.NET MVC: oci.dll, Oracle.DataAccess.dll (конечно), orannzsbb11.dll, oraociei11.dll и OraOps11w.dll. (скопируйте соответствующий x86/x64). 2) Мне удалось заставить x86-версии приложения работать на x64-машине, установив App-Pool в IIS для разрешения 32-разрядных приложений. Кроме того, при использовании Entity Framework с Oracle.DataAccess DLL Oracle должна быть версии 4.X+! (2.X не будет работать, мне потребовалось некоторое время, чтобы понять это :/) - person Jrop; 08.04.2013
comment
oracle.com/technetwork/database/ enterprise-edition/downloads/ Загрузите последнюю производственную версию ODP.NET в Oracle Database 12c Client. Этот выпуск включает в себя полностью управляемый драйвер, поддержку подключаемой базы данных, поддержку столбцов идентификаторов, собственное логическое значение PL/SQL и Transaction Guard. Настройка управляемого драйвера ODP.NET требует дополнительных действий после установки. ODP.NET, управляемый драйвер на 100% полностью управляем. Разработчики могут легко развернуть одну сборку рядом с другими версиями ODP.NET в пакете развертывания размером менее 10 МБ. - person Kiquenet; 06.08.2013
comment
@Kiquenet Я попробую и опубликую обновление. Я надеюсь, что эта версия лучше, чем ее предшественники. - person Danny Varod; 07.08.2013
comment
@Kiquenet загрузка 852/873 МБ только для того, чтобы получить клиент 32b/64b, - плохое начало. Я очень скептически отношусь к исправлениям ошибок (например, сопоставление числа (1) с логическим значением и числом с двойным значением), которые, по мнению менеджеров по продуктам, не нуждаются в исправлении на форумах Oracle. - person Danny Varod; 08.08.2013
comment
Алекс Кех (из Oracle) говорит: В настоящее время это часть клиента Oracle DB 12c. Чтобы использовать управляемый ODP.NET, вам необходимо загрузить и установить клиент БД. Оттуда вы можете извлечь только управляемую сборку ODP.NET и файлы установки. Эти файлы имеют размер менее 10 МБ и могут быть развернуты на любых целевых машинах. В настоящее время мы упаковываем отдельный управляемый выпуск ODP.NET и выпуск ODAC 12, которые будут намного меньше. Это будет выпущено на OTN в ближайшее время. - person Kiquenet; 12.08.2013
comment
Добавлено обновление для последнего клиента в виде отдельного ответа - этот уже слишком длинный :-) - person Danny Varod; 12.08.2013
comment
Среда: Visual Studio 2013, .NET 4.5.1, Enterprise Library 6, поставщик данных Oracle для .NET (ODP.NET) управляемый драйвер версии 121.1.1 от NuGet. Проблема: сбой при построении базы данных Enterprise Library для клиента, управляемого Oracle, с ошибками, включая отсутствие действительного имени поставщика ADO.NET, заданного в строке подключения. Решение: добавлен в .config только бит ‹system.data› на шаге B3. - person leqid; 02.02.2014
comment
Entity Framework Code Первая поддержка ODP.NET? Версия ODAC 12c поддерживает Entity Framework DATABASE First, а не Code First. любое решение по этому поводу? - person Kiquenet; 11.02.2014
comment
Миллион раз спасибо. Это решило мои проблемы с логическим сопоставлением, которых не было в других сообщениях. Google должен перенаправить сюда для: Указанное сопоставление участников недействительно. Тип «Edm.Boolean[Nullable=False,DefaultValue=]» члена в типе не совместим с «OracleEFProvider.number[Nullable=False,DefaultValue=,Precision=1,Scale=0]» члена в типе - person Lee Richardson; 16.05.2014
comment
Почему вы сопоставляете int16,32,64 дважды? Кроме того, сопоставление, похоже, отключено с веб-сайта Oracle: docs.oracle .com/cd/E11882_01/win.112/e23174/featLINQ.htm - person Ray Cheng; 14.08.2014
comment
@RayCheng посмотрите мои расчеты размера поля, Oracle предполагает, что данные начинаются с БД, а .NET (и ЦП) должны иметь возможность хранить весь их диапазон. Я предполагаю, что данные начинаются в приложении, сохраняются в БД и затем возвращаются в приложение, поэтому типы БД должны быть достаточно большими, чтобы хранить все типы .NET (и ЦП). Причина дублирования сопоставлений заключалась в том, чтобы разрешить сопоставление (устаревшей БД с) столбцами БД неправильного размера, которые использовались в FK, для столбцов БД правильного размера, тем самым нарушая ограничения FK в EF, которые предполагают, что обе стороны должны быть одинаковыми.NET тип. - person Danny Varod; 16.08.2014
comment
Вы знаете, где я еще могу скачать: ODP.NET_Managed_1120350_Beta.zip? Я пытаюсь подключиться к базе данных Oracle 9/10, но ODP.NET версии 12+ не подключается. Единственная загрузка ODT версии 11, которую я вижу на сайте Oracle, не включает Oracle.ManagedDataAccess.dll. - person David P; 14.09.2017
comment
После попытки следовать: я согласен с @Jrop в том, что для работы с Oracle 12.1 необходимы дополнительные файлы (спасибо). И если у вас есть возможность или возможность использовать пакеты NuGet, сделайте это. (Требуется EF6, поэтому у меня не сработало). Я также обнаружил, что если вы пытаетесь установить XCopy для всей машины (после попытки вышеизложенного и неудачной попытки), есть 3 места для проверки внешнего кода: 1) реестр, 2) путь WIN, 3) служба Oracle Win. Как только они сработают, драйверы оракула будут работать. Если служба Win не запускается или выдает ошибки при запуске, вы удаляете .bat, переустанавливаете и перезапускаете - person m1m1k; 08.04.2020
comment
@ m1m1k для более новой версии см. мой другой ответ об управляемом клиенте. Для еще более новых версий вам может потребоваться добавить ответ, если он ваш, поскольку я не использовал БД Oracle годами. - person Danny Varod; 08.04.2020

Обновление:

Миграция с Oracle.DataAccess.Client на Oracle.ManagedDataAccess.Client v12.1.0 (12c) простым способом:

Изменить: ссылка для скачивания управляемого ODAC v12c Release 1.


Если вы загружаете winx64_12c_client.zip или winnt_12c_client32.zip, извлеките их и установите (полная (административная) установка или выборочная установка с компонентом ODP.NET, установка клиента не включает этот компонент) на виртуальной машине вы найдете папку \odp.net\managed в папке «клиент».

В этой папке вы найдете common\Oracle.ManagedDataAccess.dll, x86\Oracle.ManagedDataAccessDTC.dll и x64\Oracle.ManagedDataAccessDTC.dll.

Скопируйте Oracle.ManagedDataAccess.dll в свой каталог bin и либо скопируйте правильную платформу Oracle.ManagedDataAccessDTC.dll в свой каталог bin x86/x64, либо, для каждого клиента, установите правильную платформу этой конкретной DLL в GAC, сохранив свой bin как AnyCPU.

Версия сборки новой DLL - 4.121.1.0, PublicKeyToken вроде тот же (не проверял, но заработало и без меня).

Как и прежде, добавьте этот раздел в раздел конфигурации/configSections app.config (в начало файла app.config):

<configuration>
   <configSections>

Раздел:

    <section name="oracle.manageddataaccess.client"
        type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />

и закрыть с помощью:

</configSections>

В system.data/DbProviderFactories (после вышеизложенного):

<system.data>
  <DbProviderFactories>

добавлять:

    <remove invariant="Oracle.DataAccess.Client" />
    <remove invariant="Oracle.ManagedDataAccess.Client" />

Чтобы убедиться, что у вас нет конфликтов в файле machine.config

затем добавьте:

  <add name="ODP.NET, Managed Driver" invariant="Oracle.DataAccess.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>

Примечание Я использовал Oracle.DataAccess.Client в качестве инварианта вместо официального Oracle.ManagedDataAccess.Client. Это связано с тем, что я не хочу менять все свои EDMX и перекомпилировать их сборки, чтобы заставить их использовать новый управляемый клиент вместо старого неуправляемого.

Затем добавьте следующий раздел (после приведенного выше) в ваш app.config.

 <oracle.manageddataaccess.client>
    <version number="*">
      <edmMappings>
        <edmMapping dataType="number">
          <add name="bool" precision="1"/>
          <add name="byte" precision="2" />
          <add name="int16" precision="5" />
        </edmMapping>
      </edmMappings>
    </version>
  </oracle.manageddataaccess.client>

Это прошло мое первоначальное тестирование, хотя еще не тестировалось полностью.

person Danny Varod    schedule 12.08.2013
comment
Что насчет stackoverflow .com/questions/7819861/ ? - person Kiquenet; 13.08.2013
comment
Возможно, вы можете добавить простой пример, используя Oracle.ManagedDataAccess.Client. - person Kiquenet; 13.08.2013
comment
@Kiquenet For EF Образец не требуется - работает благодаря моему трюку с регистрацией нового провайдера под именем старого провайдера. Для ADO.NET из коробки просто создайте DbConnection нового типа, используя отражение из новой DLL. - person Danny Varod; 13.08.2013
comment
@Kiquenet, пока Oracle не создаст пакет NuGet со всеми 3 DLL (клиент, DTC32, DTC64) и не заставит клиента автоматически выбирать правильную DLL для ссылки (по имени, используя отдельное имя для каждой версии) в соответствии с sizeof (IntPtr), пакет NuGet не будет полезен. Однако спасибо за ссылку - я не знал о пакете NuGet. Если вы работаете в Oracle, попросите менеджера проекта улучшить это. - person Danny Varod; 13.08.2013
comment
Alex Keh говорит о Nuget: Мы не планируем помещать управляемый ODP.NET в NuGet. Мы считаем, что управляемая загрузка ODP.NET с ODAC обеспечит те же преимущества, что и NuGet, с точки зрения изоляции сборок и размера загрузки. В треде обсуждается, должен ли Oracle предоставлять управляемую поддержку ODP.NET NuGet. После того, как вы начнете использовать ODAC 12c, я хотел бы узнать, что вы думаете о том, нужна ли по-прежнему поддержка NuGet. forums.oracle.com/thread/2559445 - person Kiquenet; 14.08.2013
comment
Официально выпущен ODAC 12c на OTN, который включает в себя ODP.NET, управляемый драйвер. Существует несколько способов загрузки управляемого драйвера в зависимости от вашего варианта использования. • Если вы используете инструменты разработчика Oracle с ODP.NET, управляемый драйвер, например, с базой данных Entity Framework First, загрузите версию ODAC универсального установщика Oracle. • Если вам нужен вариант развертывания меньшего размера, включающий другое программное обеспечение ODAC, загрузите версию ODAC xcopy. • Если вам нужна наименьшая возможная загрузка управляемого драйвера ODP.NET, используйте xcopy-версию ODP.NET, управляемого драйвера (2 МБ в сжатом виде). - person Kiquenet; 21.08.2013
comment
Работает ли это с EF CodeFirst? Я вижу ссылки на файлы EDMX, но я использую CodeFirst, поэтому не уверен, что он вообще будет работать :( - person Gustavo Rubio; 10.09.2013
comment
Не пробовал, но если вы создадите таблицы вручную, я не понимаю, почему бы и нет. Если вы ожидаете, что он создаст таблицы программно, вам придется проверить, реализовал ли Oracle эту опцию. - person Danny Varod; 10.09.2013
comment
@DannyVarod Нет, таблицы уже созданы, хотя я все еще застрял в логическом преобразовании, я попробую шаг за шагом на новой виртуальной машине и посмотрю, что произойдет, поскольку в моей среде разработки это не сработало. - person Gustavo Rubio; 10.09.2013
comment
Какую проблему вы испытываете с булевыми значениями? Это исключение во время выполнения? Это работало с предыдущей (неуправляемой) версией? - person Danny Varod; 10.09.2013
comment
Печально известная ошибка 2019: указанное сопоставление элементов недопустимо. Тип «Edm.Boolean[Nullable=False,DefaultValue=]» для логических свойств в C#, сопоставленный с столбцами NUMBER(1,0) в Oracle 11g - person Gustavo Rubio; 11.09.2013
comment
О, и да, это исключение во время выполнения, код строится просто отлично, добавил весь материал сопоставления в web.config, перестроил его, добавил схему и т. Д. И т. Д. Но все еще получаю исключение во время выполнения каждый раз, когда я пытаюсь получить доступ к любому объекту который имеет логическое свойство. - person Gustavo Rubio; 11.09.2013
comment
Вы заметили новый раздел сопоставления типов данных? (Отличается от неуправляемой версии.) Попробуйте добавить как новый, так и старый разделы сопоставления на случай, если вы случайно используете неправильную версию DLL. - person Danny Varod; 11.09.2013
comment
Выпуск ODAC 12c поддерживает Entity Framework DATABASE First, а не Code First - person Kiquenet; 11.02.2014
comment
Алекс Кех из Oracle говорит, что летом 2014 года будет доступен новый релиз управляемого драйвера ODAC с поддержкой Entity Framework Code First. - person Kiquenet; 13.02.2014