Oracle Instant Client и Entity Framework проблемы с конфигурацией

Я пытаюсь узнать и выяснить, возможно ли развернуть приложение MVC, EF, ODAC 11.2.0.3 на сервере, на котором установлена ​​предыдущая версия ODP.NET. Вместо того, чтобы обновлять сервер ODP.NET (чего я не могу), я решил использовать Oracle Instant Client.

Это выполнимо?

1) Я добавил эти библиотеки в свой проект для поддержки Instant Client.

-Oracle.DataAccess.dll

-oci.dll

-ociw32.dll

-orannzsbb11.dll

-oraociei11.dll

-OraOps11w.dll

2) Затем я обновил web.config для dbProviderFactories.

   <system.data>
    <DbProviderFactories>
    <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>

3) Это (afaik) как использовать dll Oracle в bin rathre, чем GAC

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" />
    <publisherPolicy apply="no" />
  </dependentAssembly>
</assemblyBinding>
</runtime>

4) Наконец моя строка подключения

    <connectionStrings>
    <add name="Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=Oracle.DataAccess.Client;
provider connection string=&quot;DATA SOURCE=XXX;PASSWORD=XXX;PERSIST SECURITY INFO=True;USER ID=XXX&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

Это ошибка, которую я получаю Невозможно найти запрошенный поставщик данных.Net Framework. Это не может быть установлено.

Я действительно ценю любую помощь здесь. Я довольно новичок и мне есть чему поучиться. Заранее спасибо. ура

4 ответа

Решение

Добавить <remove … /> раздел в <DbProviderFactories> элемент в веб-конфигурации, чтобы удалить любого существующего поставщика Oracle. (перед <add>)

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

Вот мое решение Xcopy.

Я отправил это в

( https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/)

также.

Но я думаю, что я могу разместить свой XML без проблем форматирования здесь.

Nuget "packages.config"

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="CommonServiceLocator" version="1.0" targetFramework="net35" />
  <package id="EnterpriseLibrary.Common" version="5.0.505.0" targetFramework="net35" />
  <package id="EnterpriseLibrary.Data" version="5.0.505.0" targetFramework="net35" />
  <package id="EntLibContrib.Data.OdpNet" version="5.0.505.0" targetFramework="net35" />
  <package id="Unity" version="2.1.505.2" targetFramework="net35" />
  <package id="Unity.Interception" version="2.1.505.2" targetFramework="net35" />
</packages>

app.config

(Обратите внимание <clear /> тег ниже. это может или не может быть необходимо, но я решил, что лучше их очистить, так как вы не знаете, что может быть в файле machine.config)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>


  <dataConfiguration defaultDatabase="OracleMainConnectionString">
  </dataConfiguration>

  <connectionStrings>

    <add name="OracleMainConnectionString"
         connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyOracleServerName)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MyServiceName)));User ID=MyUserName;Password=MyPassword;"
      providerName="Oracle.DataAccess.Client" />
  </connectionStrings>

  <appSettings>
    <add key="ExampleKey" value="ExampleValue" />
  </appSettings>

  <system.data>
    <DbProviderFactories>
      <clear />
      <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <add name="EntLibContrib.Data.OdpNet" invariant="EntLibContrib.Data.OdpNet" description="EntLibContrib Data OdpNet Provider" type="EntLibContrib.Data.OdpNet.OracleDatabase, EntLibContrib.Data.OdpNet, Version=5.0.505.0, Culture=neutral, PublicKeyToken=null" />
    </DbProviderFactories>
  </system.data>


</configuration>

Я занимаюсь разработкой на 64-разрядной машине Windows 7.

Я скачал: ODAC1120320Xcopy_32bit.zip (с сайта oracle.com)

Какой:

ODAC 11.2, выпуск 5 (11.2.0.3.20) Загрузить версию XCopy [выпущено 11 сентября 2012 г.]

Я распаковал этот zip-файл.

Я искал и выудил эти файлы:

oci.dll Oracle.DataAccess.dll orannzsbb11.dll oraociei11.dll OraOps11w.dll

Обратите внимание, что когда было 2 файла с одинаковым именем, я взял версию "bin\2.x\" или "odp.net20\bin" для своей потребности в 3.5 Framework (я еще не на 4.0).

Я взял эти файлы и поместил их в подпапку, где находится мой файл.sln.

.\MySolution.sln
.\MyConsoleApplicationFolder\MyConsoleApp.csproj
.\ThirdPartyReferences\
.\ThirdPartyReferences\Oracle\

Я помещаю все файлы выше в

.\ThirdPartyReferences\Oracle\ 

папка

Я использовал "Добавить ссылку", чтобы добавить ссылку на Oracle.DataAccess.dll в проект csharp "MyConsoleApp.csproj". (Это, конечно, означало переход к "..\ThirdPartyReferences\Oracle\")

Я использовал "Post Build Event", чтобы скопировать файлы "extra" (он же, "accessory)"

Мои строки в моем пост-посте были:

copy $(ProjectDir)..\ThirdPartyReferences\Oracle\oci.dll $(TargetDir)*.*
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\orannzsbb11.dll $(TargetDir)*.*
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\oraociei11.dll $(TargetDir)*.*
copy $(ProjectDir)..\ThirdPartyReferences\Oracle\OraOps11w.dll $(TargetDir)*.*

Обратите внимание, что мое событие после постройки заменяет "Копировать, если новее" из приведенных выше URL-инструкций.

Когда я запустил свой проект........ я получил несколько пропущенных ошибок DLL.

Примечание. В сборке, в которой есть вызовы к объектам EnterpriseLibrary.Data... вы получите "Не удается найти пространство имен Microsoft.Practices.SomethingSomething. Просто продолжайте добавлять ссылки на эти библиотеки DLL (которые выгрузит вышеупомянутый package.config), пока ошибки не исчезнут.

Как здесь конкретный:

"Could not load file or assembly 'Microsoft.Practices.ServiceLocation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified."

Итак (после запуска Nuget, конечно, чтобы загрузить все файлы) я пошел и добавил ссылку на:

\ пакеты \CommonServiceLocator.1.0\ Lib\NET35\Microsoft.Practices.ServiceLocation.dll

Это прояснило проблемы.

И мой код csharp: (примечание "select *" только для демонстрационных целей)

/*
    using System;
    using System.Data;
    using System.Data.Common;
    using Microsoft.Practices.EnterpriseLibrary.Data;
 */
public IDataReader EmployeesGetAll()
{

    IDataReader returnReader = null;

    try
    {

        Database db = DatabaseFactory.CreateDatabase();
        DbCommand dbc = db.GetSqlStringCommand("SELECT * FROM ( SELECT * FROM TEMPLOYEE ) WHERE ROWNUM <= 25");
        returnReader = db.ExecuteReader(dbc);
        return returnReader;

    }

    finally
    {
    }

}

И это сработало.

Спасибо:

https://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/

Я думаю, что это делает ODP.NET развертыванием "xcopy".

Мне все еще нужно проверить на чистой машине, чтобы быть уверенным.

Но это конец дня..............

================

Дополнительная информация:

Все выше правильно. Тем не менее, я попал в оговорку. Я использовал "Консольное приложение" для проверки своего кода.

Когда вы добавляете новое консольное приложение в visual studio, оно ПО УМОЛЧАНИЮ для x86.

Как видно здесь:

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os-aspx

РЕДАКТИРОВАТЬ: (Обновленная ссылка)

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os

Поэтому, когда я поместил всю конфигурацию, код и прочее в реальный проект (который был установлен на "Любой процессор" на 64-битной машине)... все, что я сделал, перестало работать.<

Немного подправив........ Я нашел этот файл на oracle.com ODAC1120320Xcopy_x64.zip. Затем я повторил все, что делал выше, но искал разархивированные файлы этого zip-файла x64.

Все работает.

Но та вещь по умолчанию "x86" с консольным приложением бросила меня в тупик.

Судя по вашему вопросу, вам необходимо развернуть обновление приложения и новой версии ODP.net, используя только разрешение на развертывание xcopy.

Поскольку ваше приложение изменяется, вам не нужны изменения привязки сборки или DbProviderFactories. Просто обновите csproj библиотеки классов вашим edmx и т. Д., Чтобы иметь ссылку на новую версию ODP.net, например

<Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86" />

Если у вас возникнет проблема с вашим tnsnames.ora, вам придется выполнить одно из следующих действий: a) Добавить системную переменную среды TNS_ADMIN, чтобы указать на каталог tnsnames.ora, или b) Изменить строку подключения на что-то основанный на:

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;

c) Проверьте, можете ли вы поместить копию tnsnames.ora в другое место.

Я получал ту же ошибку (поставщик данных не найден) при развертывании ODP.NET через Instant Client. Единственное, что мне нужно было сделать, это добавить следующее в мой файл exe.config (внутри тега)

<system.data>
<DbProviderFactories>
<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>
Другие вопросы по тегам