使用实体框架调用WCF .net 4.0服务时,我们收到此错误。
The 'DbProviderFactories' section can only appear once per config file
这是使用EF和其他.net 4.0服务器上的第一个应用程序.WCF服务没有收到此错误。
有没有办法在服务器上编辑机器配置文件时纠正这个错误?
答案 0 :(得分:9)
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>
答案 1 :(得分:5)
也许你可以创建web.config条目,覆盖你想要改变的任何机器范围的设置。
这里描述:
Override machine.config by web.config
将<clear />
指令置于Web配置中的DbProviderFactories
标记内,以清除然后覆盖机器配置中的重复条目。因此,对machine.config中的错误进行黑客攻击。
答案 2 :(得分:3)
您必须更新位于以下路径中的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>
答案 3 :(得分:1)
由于@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)
{
}