ASP.NET Core MVC с EF6 в IIS - Oracle.DataAccess.Client не найден - PullRequest
0 голосов
/ 04 января 2019

Есть несколько вопросов по SO уже по этой проблеме. Однако ни один из ответов при условии, что я нашел, не помог. У нас есть проект ASP.NET Core MVC, ориентированный на net461, чтобы мы могли использовать Entity Framework 6 для базы данных Oracle.

Похожие вопросы

Я и все остальные разработчики прекрасно работают на наших ПК. Однако при развертывании на сервере IIS я получаю следующее:

Error ::Schema specified is not valid. Errors:
Oracle.ManagedDataAccess.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(2,64) : error 0175: The ADO.NET provider with invariant name 'Oracle.DataAccess.Client' is either not registered in the machine or application config file, or could not be loaded. See the inner exception for details.
Oracle.ManagedDataAccess.EntityFramework.Resources.EFOracleStoreSchemaDefinitionVersion3.ssdl(3,4) : error 0019: The EntityContainer name must be unique. An EntityContainer with the name 'Schema' is already defined.
Oracle.ManagedDataAccess.EntityFramework.Resources.EFOracleStoreSchemaDefinitionVersion3.ssdl(867,4) : error 0019: Each type name in a schema must be unique. Type name 'Oracle.Table' was already defined.
Oracle.ManagedDataAccess.EntityFramework.Resources.EFOracleStoreSchemaDefinitionVersion3.ssdl(877,4) : error 0019: Each type name in a schema must be unique. Type name 'Oracle.TableColumn' was already defined.
... and so on.

Хотя я уже писал, что Oracle.ManagedDataAccess.dll - это все, что вам нужно для подключения к Oracle, на сервере я установил 64-битные клиенты Oracle 11g и 12c. Если я открою 64-битный инструмент администратора ODBC, я смогу подключиться к БД с нашего сервера, то есть проблем с подключением не будет.

В сообщении об ошибке упоминается Oracle.DataAccess.Client, но мы используем Oracle.ManagedDataAccess.Client. Нигде в нашем коде, .csproj's или packages.config мы не ссылаемся на неуправляемые dll. Я пробовал различные теги <clear /> и <remove> внутри <DbProviderFactories>. Я скопировал Oracle.DataAccess.dll из папки установки клиента Oracle прямо в папку проекта. Я удалил, переустановил, повторно развернул. Я добавил обе библиотеки DLL в GAC. Кажется, ничто не избавляет от этой ошибки.

Вот соответствующие части файла конфигурации:

<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <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>
  <entityFramework>
    <providers>
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.18.3, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <clear />
      <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>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <publisherPolicy apply="no" />
        <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
        <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.122.18.3" />
      </dependentAssembly>        
      ...         
  <connectionStrings>
    <add name="<DB_MODEL_NAME>" connectionString="metadata=res://*/;provider=Oracle.ManagedDataAccess.Client;provider connection string='<CONNECTION_STRING>'" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

Обратите внимание на бит metadata=res://*/ в строке подключения. На наших ПК это читается как res://*/<DB_MODEL_NAME>.csdl|res://*/<DB_MODEL_NAME>.ssdl|res://*/<DB_MODEL_NAME>.msl. Я обновил его до metadata=res://*/ для некоторых других сообщений. Без этого выдается ошибка:

Error ::Unable to load the specified metadata resource.

Я пробовал предложения из этой статьи , но, похоже, ни один из них не работает. Если я даю ему имя сборки, содержащее .edmx, он жалуется, что не может найти эту DLL, даже если он находится прямо в развернутой папке.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Нил,

Настройка ODP.NET и EF6 в ASP.NET Core с ориентацией на .NET 4.7.2

Посмотрите, чем отличается версия от вашей.

0 голосов
/ 04 января 2019

Neil

Несколько вопросов, чтобы помочь ответить.

Используете ли вы ядро ​​Entity Framework?

Используете ли вы управляемую библиотеку Oracle? Можно ли вообще подключиться к серверу БД с сервера приложений / веб-сервера? Вы пытались использовать простое консольное приложение для подключения к базе данных с сервера с сервера приложений / веб-сервера?

Кроме того, с точки зрения архитектуры. https://docs.microsoft.com/en-us/aspnet/core/data/entity-framework-6?view=aspnetcore-2.2

Лучше всего: Чтобы использовать Entity Framework 6, ваш проект должен компилироваться с использованием .NET Framework, поскольку Entity Framework 6 не поддерживает .NET Core. Если вам нужны кроссплатформенные функции, вам необходимо перейти на Entity Framework Core. Рекомендуемый способ использования Entity Framework 6 в приложении ASP.NET Core состоит в том, чтобы поместить классы EF6 и классы модели в проект библиотеки классов, предназначенный для полной структуры. Добавьте ссылку на библиотеку классов из проекта ASP.NET Core. Посмотрите пример решения Visual Studio с проектами EF6 и ASP.NET Core. Вы не можете поместить контекст EF6 в проект ASP.NET Core, потому что проекты .NET Core не поддерживают все функции, которые требуются командам EF6, таким как Enable-Migrations. Но сначала давайте решим первый вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...