【问题标题】:SQLite Error: The 'DbProviderFactories' section can only appear once per config file (IBM Client Access)SQLite 错误:“DbProviderFactories”部分每个配置文件只能出现一次(IBM 客户端访问)
【发布时间】:2014-05-20 07:56:55
【问题描述】:

我正在为我的应用程序实体框架和 System.Data.SQLite 在 .NET 4.5 上使用 WPF 和 C# 在我的机器上运行良好,但在测试机器上,当我通过 EntityFramework 访问 sqlite db 时收到此错误:

“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 客户端访问)有关。

我的问题是: 如何删除空元素无需手动编辑 machine.config?我试图在 app.config 文件中插入标签 &lt;clear /&gt; 但不起作用。

我发现了另一个与我类似的问题,但没有人建议如何在不手动编辑 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>

【问题讨论】:

    标签: c# wpf entity-framework sqlite


    【解决方案1】:

    我今天遇到了这个问题。

    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 (好的)
    • 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 (损坏)

    从提升的记事本中打开这两个文件,然后删除无关的空 &lt;DbProviderFactories/&gt; 元素,留下:

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

    你已经解决了。

    【讨论】:

    • 正确,但我的问题是“无需手动编辑机器配置文件即可修复...”
    • 我知道,@abrfra。但我遇到了问题,我需要解决它。我花了一段时间才找到machine.config 文件的位置。所以我想记录下我的发现,让下一个带着这个问题访问 Stackoverflow 的可怜人。这个问题是互联网上唯一记录错误的地方。下一个可怜的灵魂可能是我!
    • 对我来说同样的错误,但损坏的文件是 v4.0.30319 节点下的文件。尝试了建议的解决方案,它奏效了!谢谢!
    【解决方案2】:

    问题是由安装 IBM iAccess for Windows 引起的——特别是 .NET Provider for DB2 组件。我在 V7R1 中亲眼目睹过它,但其他人在 V6R1 中也提到了同样的问题。

    IBM 已意识到该问题,并在其中一个服务版本中进行了修复。

    来自 V7R1 service release documentation:

    针对 APAR SE45767 修复的问题描述:

    在未知情况下,安装 .Net 数据提供程序(作为完整或自定义安装类型的一部分)时,machine.config XML 文件发生损坏。损坏被隔离到与 DbProviderFactories 相关的部分 XML 数据 - 并且通常已观察到包括 XML 数据的某些行的重复。

    APAR SE45767 更正:

    将提供预防性修复,以消除 machine.config 损坏的可能原因。

    将不会提供更新已损坏的 machine.config 文件的更正修复程序。如果可能,请使用记录在案的本地修复或规避。

    APAR SE45767 的循环:

    如果不需要 .Net 数据提供程序,则可以通过执行自定义安装并确保不会安装 .Net 数据提供程序来避免此问题。如果需要 .Net 提供程序,则不知道有任何规避。利用本地修复解决问题。

    至于一旦出现问题就解决问题,您需要修复 machine.config(32 位和 64 位),因为它不符合为系统定义的架构。数据。这很简单——只需编写一个简单的 .NET 应用程序,它使用 XmlDocument 加载 machine.config,找到重复的 DbProviderFactories 元素,将其删除并保存文件。或者使用 PowerShell 脚本或其他任何可以操作 XML 文档的工具。

    这是 V6R1 中的 IBM APAR discussing this issue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 2017-08-07
      • 1970-01-01
      相关资源
      最近更新 更多