Oracle Instant Client и Entity Framework проблемы с конфигурацией - PullRequest
8 голосов
/ 28 марта 2012

Я пытаюсь узнать и выяснить, возможно ли развернуть приложение 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 ]

3 голосов
/ 02 апреля 2012

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

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

1 голос
/ 23 января 2013

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

Я разместил это на

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

также.

Но я думаю, что могу опубликовать свой 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>

Я занимаюсь разработкой на компьютере x64 с 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» для копирования файлов «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: (примечание "выберите *" только для демонстрационных целей)

/*
    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/#comment-181

Я думаю, что это делает 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-битной машине) ... все, что я сделал, перестало работать. <</p>

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

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

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

1 голос
/ 29 марта 2012

Исходя из вашего вопроса, вам необходимо развернуть обновление приложения и новой версии 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, или б) Измените строку подключения на что-то на основе:

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

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

0 голосов
/ 15 октября 2013

Я получаю ту же ошибку (поставщик данных не найден) при развертывании 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>
...