我们在使用实体框架调用 WCF .net 4.0 服务时收到此错误。
The 'DbProviderFactories' section can only appear once per config file
它是使用 EF 和其他 .net 4.0 WCF 服务的服务器上的第一个应用程序没有收到此错误。
有没有办法在不编辑服务器上的机器配置文件的情况下纠正这个错误?
我们在使用实体框架调用 WCF .net 4.0 服务时收到此错误。
The 'DbProviderFactories' section can only appear once per config file
它是使用 EF 和其他 .net 4.0 WCF 服务的服务器上的第一个应用程序没有收到此错误。
有没有办法在不编辑服务器上的机器配置文件的情况下纠正这个错误?
安装 IBM DB2 .NET 提供程序会导致空的 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>
也许您可以创建 web.config 条目来覆盖您想要更改的任何机器范围的设置。
此处描述:
通过 web.config 覆盖 machine.config
将<clear />
指令放在DbProviderFactories
web 配置中的标签内,以清除然后覆盖机器配置中的重复条目。因此,对 machine.config 中的错误进行了破解。
您必须更新位于以下路径中的 Machine.config 文件。
C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Machine.Config
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Machine.Config
对于 64 位机器,Machine.config 将位于...\Framework64\...
要注意的块是这样的:
<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"/>
</DbProviderFactories>
<!-- This is the line to remove - empty element --><DbProviderFactories/>
</system.data>
正如@yonsk 已经提到为什么会出现此问题(重复条目),您可以创建一个可以修复 machine.config 文件的控制台应用程序,然后在收到异常时从您的应用程序的安装程序或从您的应用程序调用该控制台应用程序。以下代码可用于修复 machine.config 文件的控制台应用程序。
class Program
{
static void Main()
{
string machineConfigFilePath = RuntimeEnvironment.SystemConfigurationFile;
XDocument xdoc = XDocument.Load(machineConfigFilePath);
XElement[] elements = xdoc.XPathSelectElements("//configuration/system.data/DbProviderFactories").ToArray();
if (elements.Any())
{
foreach (XElement anElement in elements)
{
if (!anElement.HasElements)
anElement.Remove();
}
}
xdoc.Save(machineConfigFilePath);
}
}
如果您想从您的应用程序调用控制台应用程序,您需要以管理员身份调用它。因此,以下代码段可能有助于以管理员身份调用该控制台应用程序(将提示用户接受对话框。)
try
{
Process process = Process.Start(new ProcessStartInfo
{
Verb = "runas",
FileName = "/Path/to/the/console/application",
UseShellExecute = true,
CreateNoWindow = true,
});
process.WaitForExit();
int exitCode = process.ExitCode;
}
catch (Exception ex)
{
}