Ошибка SQLite: раздел "DbProviderFactories" может отображаться только один раз в файле конфигурации (клиентский доступ IBM)

Я использую для своего приложения Entity Framework и System.Data.SQLite с использованием WPF и С# в .NET 4.5 На моей машине все работает хорошо, но на тестовой машине я получил эту ошибку, когда я получаю доступ к базе данных sqlite через EntityFramework:

Раздел "DbProviderFactories" может появляться только один раз для каждого файла конфигурации.

Я обнаружил, что ошибка была в том, что на тестовой машине, в machine.config:

<system.data>
    <DbProviderFactories>
        <add name="IBM DB2 for i5/OS .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for i5/OS" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26"/>
        <add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
        <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>
    <!-- This is the line to remove - empty element --> 
    <DbProviderFactories/>
</system.data>

Я удаляю последний пустой элемент и теперь все работает. Я думаю, что это связано с установкой IBM.Data.DB2.iSeries(IBM Client Access).

Мой вопрос: как удалить пустой элемент без редактирования вручную machine.config? Я пытался вставить тег <clear/> в файл app.config, но не работает.

Я нашел другой вопрос, похожий на мой, но ни один не подсказал, как решить проблему без редактирования вручную machine.config для решения проблемы.

это мой файл app.config:

<?xml version="1.0" encoding="utf-8"?>
<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=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <system.xml.serialization>
    <xmlSerializer useLegacySerializerGeneration="true" />
  </system.xml.serialization>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    <!--STAI MOLTO ATTENTO-->
    <legacyUnhandledExceptionPolicy enabled="1"/>
  </startup>
  <connectionStrings>
    <add name="db" connectionString="Data Source=clients.db;Version=3;New=False;Compress=True;" />
    <add name="icmdbEntities" connectionString="metadata=res://*/MainModel.csdl|res://*/MainModel.ssdl|res://*/MainModel.msl;provider=System.Data.SQLite;provider connection string=&quot;data source=.\icmdb.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <clear />
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
  <appSettings>
    <add key="ditta" value="default" />
    <add key="demo" value="true"/>
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>
  <system.web>
    <membership defaultProvider="ClientAuthenticationMembershipProvider">
      <providers>
        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
      </providers>
    </membership>
    <roleManager defaultProvider="ClientRoleProvider" enabled="true">
      <providers>
        <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
      </providers>
    </roleManager>
  </system.web>
</configuration>

Ответ 1

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

Что касается исправления проблемы после ее возникновения, вам необходимо исправить machine.config (как 32-разрядную, так и 64-разрядную), поскольку она не соответствует схеме, определенной для системы. данные. Это просто - просто напишите простое .NET-приложение, которое использует XmlDocument для загрузки machine.config, найдите дубликат элемента DbProviderFactories, удалите его и сохраните файл. Или используйте PowerShell script или что-нибудь еще, что может манипулировать XML-документами.

Здесь IBM APAR обсуждает эту проблему в V6R1.

Ответ 2

Сегодня я столкнулся с этой проблемой.

Файлы machine.config расположены в:

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config
  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
  • C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\machine.config
  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config

Коррумпированная версия machine.config содержит:

<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>

Установка драйверов iSeries привела к повреждению следующих файлов machine.config:

| Framework | Platform | Factory Added? | Corrupted Machine.config? |
|-----------|----------|----------------|---------------------------|
|v4.0.30319 |   x64    |     Yes        |   Yes                     |
|v4.0.30319 |   x86    |     Yes        |   Yes                     |
|v2.0.50727 |   x86    |     No         |   No                      |
|v2.0.50727 |   x64    |     No         |   No                      |

Приятно, что вам нужно только беспокоиться о том, что IBM развращает половину ваших файлов machine.config; и только те приложения, которые используют .NET 4.

Файлы для исправления

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config (ok)
  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config (ok)
  • C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\machine.config (поврежден)
  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config (поврежден)

Из надстрочного блокнота откройте два файла и удалите посторонний пустой элемент <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>
</system.data>

И вы исправлены.