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

时间:2012-12-11 14:53:05

标签: wcf iis-7 entity-framework-4 machine.config

使用实体框架调用WCF .net 4.0服务时,我们收到此错误。

The 'DbProviderFactories' section can only appear once per config file

这是使用EF和其他.net 4.0服务器上的第一个应用程序.WCF服务没有收到此错误。

有没有办法在服务器上编辑机器配置文件时纠正这个错误?

4 个答案:

答案 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)
            {

            }