API для изменения файла machine.config - раздел "DbProviderFactories" может появляться только один раз для каждого файла конфигурации
Недавно я столкнулся со следующей ошибкой на клиентском компьютере:
Раздел "DbProviderFactories" может появляться только один раз для каждого файла конфигурации.
Похоже, что конфигурация машины содержит дубликат элемента DbProviderFactories.
<system.data>
<DbProviderFactories>
<add name="IBM DB2 for i .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for IBM i" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26" />
</DbProviderFactories>
<DbProviderFactories />
</system.data>
Удаление этого дополнительного элемента вручную устраняет проблему, и наше программное обеспечение может работать. Однако нам было предложено попытаться обойти это, возможно, игнорируя дублирующуюся запись в нашем собственном app.config. Это связано с тем, что многие клиенты могут иметь одну и ту же проблему, и мы не можем изменять конфигурационный файл каждого.
Я пытался добавить <clear/>
элемент в разделе system.data, мы надеемся переопределить то, что уже есть в machine.config. Однако это не работает.
Например
<system.data>
<clear />
<DbProviderFactories>
<add name="Microsoft SQL Server Compact Data Provider 4.0"
invariant="System.Data.SqlServerCe.4.0"
description=".NET Framework Data Provider for Microsoft SQL Server Compact"
type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
</DbProviderFactories>
</system.data>
Есть ли способ программно игнорировать дубликат элемента DbProviderFactories?
Существует ли API, позволяющий вам изменить конфигурацию машины?
Кто-нибудь может помочь или порекомендовать решение?
С уважением
3 ответа
Недавно я столкнулся с этой же проблемой, пытаясь использовать SqlServerCe с Entity Framework.
Мне удалось обойти эту проблему с помощью функций конфигурации на основе кода, доступных в Entity Framework 6.
Все, что вам нужно сделать, это удалить <entityframeowrk>
а также <system.data>
теги от вашего app.config
и включите в ваш проект класс, подобный следующему:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServerCompact;
using System.Data.SqlServerCe;
namespace Data
{
public class DatabaseConfiguration : DbConfiguration
{
public DatabaseConfiguration()
{
SetExecutionStrategy("System.Data.SqlServerCe.4.0", () => new DefaultExecutionStrategy());
SetProviderFactory("System.Data.SqlServerCe.4.0", new SqlCeProviderFactory());
SetProviderServices("System.Data.SqlServerCe.4.0", SqlCeProviderServices.Instance);
}
}
}
Затем Entity Framework автоматически подберет это для вас и будет использовать. Обратите внимание, что конфигурация в app.config
перезапишет все, что появляется в этом классе.
Также, если вы не хотите включать этот класс в слой данных, см. Раздел "Перемещение DbConfiguration" здесь.
Я столкнулся с той же проблемой, и, похоже, вызван драйвером IBM DB2.
Я не думаю, что вы можете игнорировать дублированную запись: ошибка не возникает в вашем приложении, она возникает на платформе.NET, которая не может проверить machine.config
когда это читает.
Поскольку проверка не проходит и конфигурация не загружена, вы не можете манипулировать ею через любой вид API.
Лучше всего написать простое консольное приложение, которое не использует провайдера данных, проанализировать и исправить файл конфигурации с помощью простых манипуляций с XML. Если я правильно помню, только приложения, использующие поставщики данных, вызывают исключение, поэтому вы должны быть в состоянии сделать это; если нет, пожалуйста, дайте мне знать, чтобы я мог обновить ансер.
Как упомянул @Albireo, проблема вызвана установкой IBM iAccess для Windows, в частности, компонента.NET Provider for DB2. Я видел это воочию в V7R1, но другие ссылались на ту же проблему с V6R1.
IBM знает об этой проблеме и исправляет ее в одном из сервисных выпусков.
Из документации по сервисному выпуску V7R1:
ОПИСАНИЕ ЗАДАЧИ, ИСПРАВЛЕННОЙ ДЛЯ APAR SE45767:
При неизвестных обстоятельствах повреждение XML-файла machine.config происходит, когда установлен поставщик данных.Net (как часть полной или пользовательской установки). Коррупция изолирована от частей данных XML, связанных с DbProviderFactories, и, как правило, наблюдается дублирование некоторых строк данных XML.
ИСПРАВЛЕНИЕ ДЛЯ APAR SE45767:
Будет предоставлено профилактическое исправление, которое устранит вероятную причину повреждения machine.config.
Исправление для обновления уже поврежденных файлов machine.config не будет предоставлено. По возможности используйте документированные локальные исправления или обходные пути.
ОБСТОЯТЕЛЬСТВО ДЛЯ APAR SE45767:
Если поставщик данных.Net не нужен, этой проблемы можно избежать, выполнив выборочную установку и убедившись, что поставщик данных.Net не будет установлен. Если требуется поставщик.Net, обход не известен. Используйте локальное исправление, чтобы решить проблему.