【问题标题】:API to modify the machine.config file - 'DbProviderFactories' section can only appear once per config file修改 machine.config 文件的 API - 每个配置文件中的“DbProviderFactories”部分只能出现一次
【发布时间】:2014-03-14 15:59:11
【问题描述】:

我最近在客户端机器上遇到了以下错误:

“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 中的重复条目来解决此问题。这是因为很多客户端可能有同样的问题,我们不能修改每个人的配置文件。

我尝试在 system.data 部分中添加 &lt;clear/&gt; 元素,以希望覆盖 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?

谁能提供帮助或推荐解决方案?

亲切的问候

【问题讨论】:

    标签: c# .net visual-studio-2012 machine.config


    【解决方案1】:

    我最近在尝试将 SqlServerCe 与实体框架一起使用时遇到了同样的问题。

    我已经设法通过使用 Entity Framework 6 中提供的Code-Based configuration 功能解决了这个问题。

    您需要做的就是从您的app.config 中删除&lt;entityframeowrk&gt;&lt;system.data&gt; 标记,并在您的项目中包含一个类似于以下内容的类:

    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);
            }
        }
    }
    

    实体框架会自动为您挑选并使用它。需要注意的一点是app.config 中的配置将覆盖此类中出现的任何内容。

    此外,如果您不想在数据层中包含此类,请参阅“移动 DbConfiguration”部分 here

    【讨论】:

    • 非常感谢您找到解决此问题的方法 :)
    【解决方案2】:

    我也遇到过同样的问题,好像是 IBM DB2 驱动造成的。

    我认为您不能忽略重复的条目:错误不是由您的应用程序引发的,而是由 .NET 框架引发的,它在读取 machine.config 时无法验证它。

    由于验证失败且配置未加载,因此您无法通过任何类型的 API 对其进行操作。

    最好的办法是编写一个简单的控制台应用程序,该应用程序使用任何数据提供程序,并通过纯 XML 操作解析和修复配置文件。如果我没记错的话,只有使用数据提供程序的应用程序会触发异常,那么您应该可以做到;如果没有,请告诉我,以便我更新分析器。

    【讨论】:

      【解决方案3】:

      正如@Albireo 提到的,问题是由安装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 提供程序,则不知道有任何规避。利用本地修复解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-02
        • 2011-09-16
        相关资源
        最近更新 更多