C# API修改machine.config文件-';DBProviderFactorys&x27;节只能在每个配置文件中显示一次

C# API修改machine.config文件-';DBProviderFactorys&x27;节只能在每个配置文件中显示一次,c#,.net,visual-studio-2012,machine.config,C#,.net,Visual Studio 2012,Machine.config,我最近在客户端计算机上遇到以下错误: “DbProviderFactorys”部分在每个配置文件中只能出现一次 机器配置似乎包含重复的DbProviderFactorys元素 <system.data> <DbProviderFactories> <add name="IBM DB2 for i .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framewor

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

“DbProviderFactorys”部分在每个配置文件中只能出现一次

机器配置似乎包含重复的DbProviderFactorys元素

<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部分中添加一个
元素,希望覆盖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>

有没有办法以编程方式忽略重复的DbProviderFactorys元素

是否存在允许您修改机器配置的API

有人能帮忙或推荐解决方案吗


我遇到了同样的问题,似乎是由IBM DB2驱动程序引起的

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

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


最好的方法是编写一个简单的控制台应用程序,它不使用任何数据提供程序,并通过简单的XML操作解析和修复配置文件。如果我没有记错,只有使用数据提供程序的应用程序才会触发异常,因此您应该能够做到这一点;如果没有,请告诉我,以便我可以更新anser。

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

通过使用EntityFramework6中提供的功能,我成功地解决了这个问题

您只需从
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);
        }
    }
}
实体框架将自动为您选择并使用它。需要注意的是,
app.config
中的配置将覆盖此类中出现的任何内容


另外,如果您不想在数据层中包含此类,请参阅Moving DbConfiguration部分。

正如@Albireo所提到的,问题是由于安装IBM iAccess for Windows,特别是.NET Provider for DB2组件而引起的。我在V7R1中亲眼目睹了这一点,但其他人在V6R1中也提到了同样的问题

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

从V7R1:

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

APAR SE45767的更正: 将提供预防性修复程序,以消除machine.config损坏的可能原因

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

针对APAR SE45767的规避: 如果不需要.Net数据提供程序,则可以通过执行自定义安装并确保不安装.Net数据提供程序来避免此问题。如果需要.Net提供程序,则不存在已知的规避。利用本地修复程序解决问题


非常感谢您找到此问题的解决方案:)