DbProviderFactories for .NET Ошибка
У меня проблемы с получением библиотеки ODP.NEt для работы с.NET DBProviderFactories. Я получаю следующую ошибку с этим кодом:
_DBFactory = DbProviderFactories.GetFactory(providerName);
Произошла ошибка при создании обработчика раздела конфигурации для system.data: столбец InvariantName должен быть уникальным. Значение 'Oracle.DataAccess.Client' уже присутствует.
с этим поставщиком Name: Oracle.DataAccess.Client
И следующая запись в web.config:
<system.data>
<DbProviderFactories>
<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=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
Кто-нибудь знает, что не так? Я не думаю, что это настроено дважды где-нибудь.
4 ответа
Если вы установили ODP.net (например, используя универсальный установщик oracle, а не xcopy), вы найдете тот же DbProviderFactories/add в machine.config.
Поэтому добавление его в ваш файл web.config - это добавление во второй раз, поэтому дублируйте Oracle.DataAccess.Client!
Вы можете сделать ниже? (Обратите внимание на "очистить")
<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=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
Следует отметить, что <clear />
очистит все DbProviderFactories
что вы можете не захотеть делать, в зависимости от вашей ситуации.
Вы также можете просто удалить этот класс прямо перед его повторным добавлением, добавив следующую строку:
<remove invariant="Oracle.ManagedDataAccess.Client" />
Вот как все <system.data>
будет смотреться:
<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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
Это может быть полезно, если на вашем локальном компьютере и на сервере нет соответствующих файлов конфигурации, таких как machine.config.
Другая вещь, которую вы можете сделать, это просто удалить ее из вашего web.config, при условии, что настройка в вашем machine.config будет работать. Однако я бы протестировал это как на вашей машине разработки, так и на ваших серверах. В моем случае это работало на одном, но не на другом, потому что файлы machine.config не совпадали. Чтобы решить эту проблему, я добавил этот же параметр в файл machine.config на сервере без <remove invariant="Oracle.ManagedDataAccess.Client" />
вот так:
<system.data>
<DbProviderFactories>
<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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
Скорее всего, произошел сбой раздела конфигурации файла DbProviderFactories. Проверьте, есть ли дополнительная строка Oracle.DataAccess.Client, которая остается после удаления клиента Oracle.