我们在使用实体框架调用WCF .net 4.0服务时收到此错误。“DbProviderFactories”部分每个配置文件只能出现一次
The 'DbProviderFactories' section can only appear once per config file
这是使用EF和其他.net 4.0的服务器上的第一个应用程序WCF服务没有收到此错误。
是否有任何方法可以在服务器上编辑机器配置文件来纠正此错误?
我们在使用实体框架调用WCF .net 4.0服务时收到此错误。“DbProviderFactories”部分每个配置文件只能出现一次
The 'DbProviderFactories' section can only appear once per config file
这是使用EF和其他.net 4.0的服务器上的第一个应用程序WCF服务没有收到此错误。
是否有任何方法可以在服务器上编辑机器配置文件来纠正此错误?
也许你可以创建web.config项来覆盖你想改变的机器范围设置。
说明如下:
Override machine.config by web.config
把<clear />
指令DbProviderFactories
标签内的网络配置,以清除,然后覆盖在机器的配置做重复的条目。因此,对machine.config中的错误进行了黑客工作。
谢谢我能够用它来覆盖机器配置,并证明他们需要修复机器配置...我<3政治 – Chad
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>
正如@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)
{
}
我非常确定,如果我尝试运行,我会被解雇..但很酷的解决方案。 – Chad
必须更新位于以下路径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
你可以在配置文件的位置附近定义DbProviderFactories部分吗?这个页面说你可以删除第二个DbProviderFactories标签,它解决了这个问题。这是你有问题吗?:http://forums.asp.net/t/1693277.aspx/1 –
@EricLeschinski - 不,我不能访问配置。我意识到这个问题......这正是我试图通过解决这个问题来证明的。 – Chad