c# - 修改 machine.config 文件的 API - 'DbProviderFactories' 部分在每个配置文件中只能出现一次

标签 c# .net visual-studio-2012 machine.config

我最近在客户端机器上遇到了以下错误:

“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>

手动删除这个额外的元素可以解决问题,我们的软件可以运行。但是,有人要求我们尝试通过可能忽略我们自己的 app.config 中的重复条目来解决这个问题。这是因为很多客户端可能有同样的问题,我们不能修改每个人的配置文件。

我试过添加 <clear/> system.data 部分中的元素,希望覆盖 machine.config 中已有的内容。但是,这不起作用。

例如

<system.data>
    <clear />
    <DbProviderFactories>
      <add name="Microsoft SQL Server Compact Data Provider 4.0" 
           invariant="System.Data.SqlServerCe.4.0" 
           description=".NET Framework Data Provider for Microsoft SQL Server Compact" 
           type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
    </DbProviderFactories>
  </system.data>

有没有办法以编程方式忽略重复的 DbProviderFactories 元素?

是否存在允许您修改机器配置的 API?

任何人都可以提供帮助或推荐解决方案吗?

亲切的问候

最佳答案

我最近在尝试将 SqlServerCe 与 Entity Framework 一起使用时遇到了同样的问题。

我已经设法通过使用 Code-Based configuration 解决了这个问题。 Entity Framework 6 中可用的功能。

您需要做的就是删除 <entityframeowrk><system.data>来自您的 app.config 的标签并在您的项目中包含一个类似于以下内容的类:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServerCompact;
using System.Data.SqlServerCe;

namespace Data
{
    public class DatabaseConfiguration : DbConfiguration
    {
        public DatabaseConfiguration()
        {
            SetExecutionStrategy("System.Data.SqlServerCe.4.0", () => new DefaultExecutionStrategy());
            SetProviderFactory("System.Data.SqlServerCe.4.0", new SqlCeProviderFactory());
            SetProviderServices("System.Data.SqlServerCe.4.0", SqlCeProviderServices.Instance);
        }
    }
}

然后 Entity Framework 会自动为您挑选并使用它。需要注意的是 app.config 中的配置将覆盖出现在此类中的任何内容。

此外,如果您不想在数据层中包含此类,请参阅移动 DbConfiguration 部分 here .

关于c# - 修改 machine.config 文件的 API - 'DbProviderFactories' 部分在每个配置文件中只能出现一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22410059/

相关文章:

c++ - Microsoft Visual C++ Redistributable for Visual Studio 2012 Update 4 Installer 中文显示

c# - 将可点击的超链接添加到没有新段落的 RichTextBox

c# - 如何将当前行 "This"作为转换器参数传递

c# - ASP.NET 2.0 TreeView - OnSelectedNodeChanged 不会在用户控件中触发

c# - TransactionScope 中的 NLog 导致 Transaction 无效

c# - 如何在 C# 中通过 DropBoxRest API 获取 Dropbox 文件?

c# - Visual Studio C# ASP.NET 找不到资源但返回的路径错误

visual-studio - 在 TeamCity 中运行和报告 Visual Studio 2012 代码分析

c# - 线程 ARP ping

java - 接下来我应该学习什么 DI/IoC 框架?