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

9
我们在调用使用实体框架的WCF .net 4.0服务时收到了该错误。
The 'DbProviderFactories' section can only appear once per config file

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

是否有任何方法可以在不编辑服务器上的机器配置文件的情况下纠正此错误?


原因是我们的服务器团队希望我证明这是问题,然后他们才愿意更改机器配置。所以我必须在不编辑配置的情况下解决问题,以便他们可以修复机器配置... 是的,就是那个问题。 - Chad
1
你能否发布一下配置文件中定义DbProviderFactories部分的代码片段?这个页面说你可以删除第二个DbProviderFactories标签,它会解决问题。这是你遇到的问题吗?:http://forums.asp.net/t/1693277.aspx/1 - Eric Leschinski
@EricLeschinski - 不,我无法访问配置。我知道那个修复方法……我正在尝试通过绕过它来证明需要它。 - Chad
1
他们甚至不让你看配置文件?哇,我好久没玩“领土战争”了。听起来像是一个博弈论/政治问题。戴上你的政治家帽子。将上面的链接和错误信息发送给你的经理,并说:“请将这些注释转发给服务器团队,因为他们甚至不让我查看它们有缺陷的软件,所以我无法修复它。”然后就超出了你的掌控范围。不要用锤子去打火,使用有效的回应:水。你会让那些装腔作势的政客在没有时间内找到新的优势点。 - Eric Leschinski
4个回答

10
安装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>

有没有办法在不编辑服务器上的机器配置文件的情况下纠正这个错误? - 我无法访问机器配置文件以将其删除。 - Chad
嗨 Chad,据我所知没有这个功能,我不得不修改这个文件。请您的系统管理员为您执行此操作。 - yonsk

4

您需要更新位于以下路径的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>

那是关键部分...有没有办法在不编辑服务器上的机器配置文件的情况下纠正这个错误? - Chad
抱歉 Chad,我错过了那一行。我只关注了标题。我在寻找解决错误的方法,后来在别处找到了解决方案。我想在这里分享它,以便对某人有所帮助。 - Sundeep
1
需要注意的是:在删除该行后,您必须是管理员才能保存文件。 - Alexandre

4
也许您可以创建web.config条目,覆盖您想要更改的任何机器范围设置。
在此处描述: 通过web.config覆盖machine.config 将指令放置在web配置中的DbProviderFactories标记内,以清除并覆盖机器配置中重复的条目。从而绕过机器配置中的错误。

2
谢谢,我能够使用这个来覆盖机器配置并证明他们需要修复机器配置...我<3政治。 - Chad

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

            }

2
我非常确定,如果我尝试运行那个程序,我肯定会被解雇...但是这个解决方案很棒。 - Chad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接