2012-12-11 665 views
9

我们在使用实体框架调用WCF .net 4.0服务时收到此错误。“DbProviderFactories”部分每个配置文件只能出现一次

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

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

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

+0

原因是我们的服务器团队希望我证明这是个问题在他们愿意改变机器配置之前。所以我必须解决这个问题,以便编辑配置,以便他们将修复机器配置...是的那个问题 – Chad

+1

你可以在配置文件的位置附近定义DbProviderFactories部分吗?这个页面说你可以删除第二个DbProviderFactories标签,它解决了这个问题。这是你有问题吗?:http://forums.asp.net/t/1693277.aspx/1 –

+0

@EricLeschinski - 不,我不能访问配置。我意识到这个问题......这正是我试图通过解决这个问题来证明的。 – Chad

回答

5

也许你可以创建web.config项来覆盖你想改变的机器范围设置。

说明如下:

Override machine.config by web.config

<clear />指令DbProviderFactories标签内的网络配置,以清除,然后覆盖在机器的配置做重复的条目。因此,对machine.config中的错误进行了黑客工作。

+1

谢谢我能够用它来覆盖机器配置,并证明他们需要修复机器配置...我<3政治 – Chad

8

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> 
+0

有没有办法纠正这个错误,出去编辑服务器上的机器配置文件? - 我没有访问机器配置删除它 – Chad

+0

嗨乍得,不是我所知道的,我不得不去触摸并修改这个文件,请你系统管理员为你采取行动 – yonsk

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

      } 
+1

我非常确定,如果我尝试运行,我会被解雇..但很酷的解决方案。 – Chad

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> 
+0

从问题'有没有办法纠正这个错误,编辑服务器上的机器配置文件?'这是关键部分... – Chad

+0

对不起乍得。我错过了那条线。我只专注于标题。我正在寻找一种方法来解决错误,我发现解决方案在其他地方。我想在这里分享它,这将有助于某人。 – Sundeep

+1

重要提示:您必须是管理员才能在删除该行后保存该文件。 – Alexandre

相关问题