用于修改machine.config文件的API – ‘DbProviderFactories’部分每个配置文件只能出现一次

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

“DbProviderFactories”部分每个配置文件只能出现一次。

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

      

手动删除这个额外的元素可以解决问题,我们的软件可以运行。 但是,有人要求我们尝试通过忽略我们自己的app.config中的重复条目来解决这个问题。 这是因为许多客户端可能有同样的问题,我们无法修改每个人的配置文件。

我已经尝试在system.data部分中添加一个元素,希望覆盖machine.config中已有的内容。 但是,这不起作用。

例如

       

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

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

有人可以帮忙,或推荐一个解决方案?

亲切的问候

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

我已经设法通过使用Entity Framework 6中提供的基于代码的配置function来解决此问题。

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

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

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

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

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

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

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

正如@Albireo所提到的,问题是由安装IBM iAccess for Windows – 特别是.NET Provider for DB2组件引起的。 我在V7R1中亲眼看过它,但是其他人在V6R1中引用了同样的问题。

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

从V7R1 服务发布文档 :

针对APAR SE45767的问题描述:

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

APAR SE45767的修正:

将提供一个预防性修复程序,它将消除machine.config损坏的可能原因。

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

APAR SE45767的注意事项:

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