【问题标题】:The 'DbProviderFactories' section can only appear once per config file每个配置文件中的“DbProviderFactories”部分只能出现一次
【发布时间】:2012-12-11 14:53:05
【问题描述】:

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

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

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

有什么方法可以在不编辑服务器上的机器配置文件的情况下纠正这个错误?

【问题讨论】:

  • 原因是我们的服务器团队希望我在他们愿意更改机器配置之前证明这是问题所在。所以我必须通过编辑配置来解决问题,以便他们修复机器配置......是的那个问题
  • 你能把配置文件的位发布在它定义 DbProviderFactories 部分的位置吗?该页面说您可以删除第二个 DbProviderFactories 标记并解决问题。这是你的问题吗?:forums.asp.net/t/1693277.aspx/1
  • @EricLeschinski - 不,我无法访问配置。我知道该修复程序...这是我试图通过解决它来证明所需要的。
  • 他们甚至不让你看到配置文件??哇,好久没玩“地盘大战”了。听起来像一个博弈论/政治问题。戴上你的政治帽子。将上面的链接和错误消息发送给您的经理并说:“请将这些注释转发给服务器团队,因为我实际上不可能修复他们的错误软件,因为他们甚至不让我看到它。然后就是不要用锤子敲火,使用有效的反应:水。你很快就会让那些装腔作势的政客们扭动着寻找新的有利位置。

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


【解决方案1】:

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>

【讨论】:

  • 有没有办法在不编辑服务器上的机器配置文件的情况下纠正这个错误? - 我无权访问机器配置来删除它。
  • 嗨,乍得,我不知道,我不得不触摸和修改这个文件。请您的系统管理员为您执行此操作。
【解决方案2】:

也许您可以创建 web.config 条目来覆盖您想要更改的任何机器范围的设置。

此处描述:

Override machine.config by web.config

&lt;clear /&gt; 指令放在网络配置中的DbProviderFactories 标记内,以清除并覆盖机器配置中的重复条目。从而解决 machine.config 中的错误。

【讨论】:

  • 谢谢我能够使用它来覆盖机器配置并证明他们需要修复机器配置...我
【解决方案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>

【讨论】:

  • 来自问题Is there any way to correct this error with out editing the machine config file on the server? 那是关键部分...
  • 对不起乍得。我错过了那条线。我只关注标题。我一直在寻找解决错误的方法,并在其他地方找到了解决方案。我想在这里分享它,以便对某人有所帮助。
  • 重要提示:您必须是管理员才能在删除该行后保存文件。
【解决方案4】:

正如@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);
        }
    }

如果您想从您的应用程序调用控制台应用程序,您需要以管理员身份调用它。因此,以下 sn-p 可能有助于以管理员身份调用该控制台应用程序(将提示用户接受对话框。)

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

            }

【讨论】:

  • 我很确定如果我尝试跑步我会被解雇......但是很酷的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 2011-09-16
  • 2014-02-05
相关资源
最近更新 更多