修改machine.config文件的API - 'DbProviderFactories'部分每个配置文件只能出现一次

时间:2014-03-14 15:59:11

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

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

'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部分添加一个<clear/>元素,希望覆盖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 个答案:

答案 0 :(得分:3)

我最近在尝试将SqlServerCe与Entity Framework一起使用时遇到了同样的问题。

我已成功使用Entity Framework 6中提供的Code-Based configuration功能解决此问题。

您需要做的就是从<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);
        }
    }
}

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

正如@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 Data提供程序来避免此问题。如果需要.Net提供者,则不知道规避。利用本地修复程序解决问题。