App.config中的connectionStrings configSource无法工作

61

我试图将我的连接字符串与App.config分离开来,由于无法像Web.config那样进行转换,所以我想使用configSource属性指向另一个包含连接字符串的配置文件,但它似乎不起作用。

这是App.config的工作方式:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=*snip*" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <connectionStrings>
    <add name="DefaultConnection"
      providerName="System.Data.SqlClient"
      connectionString="Server=*snip*" />
  </connectionStrings>
</configuration>

但是这个不行,App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=*snip*" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <connectionStrings configSource="connections.config" />      
</configuration>

connections.config:

<connectionStrings>
    <add name="DefaultConnection"
      providerName="System.Data.SqlClient"
      connectionString="*snip*" />
</connectionStrings>

我正在寻找最简单的解决方案。

有什么想法吗?


1
什么出了问题?有哪些症状?你发布的内容对我有效。.config文件是否在同一个目录下? - Oded
我正在使用的类使用了一个DbContext,它需要一个连接字符串参数,所以我传递了DefaultConnection。当连接字符串在App.config中定义时,它可以工作,但在单独的文件中定义时则不行。 - Adam K Dean
1
确保两个文件都已保存并位于同一目录中(或者在 configSource 中相对路径正确)。 - Oded
他们坐在同一个目录下,这太奇怪了。 - Adam K Dean
1
我已经将代码放到测试控制台应用程序中,结果出现了{"The type initializer for 'System.Data.Entity.Internal.AppConfig' threw an exception."}{"Unable to open configSource file 'connections.config'. (*project directory*\\bin\\Debug\\TestApp.vshost.exe.config line 17)"}这两个错误信息,这让我想知道它是否没有将其他配置文件复制到构建目录中... - Adam K Dean
2个回答

136
如果您是自行添加该文件,则构建操作(在文件属性中)可能未正确设置。需要将“复制到输出目录”选项设置为“仅在较新时复制”或“始终复制”,以确保.config文件最终出现在bin目录中,否则它将不在那里,尝试加载配置将失败。右键单击文件,然后单击“属性”。

enter image description here

将其更改为“始终复制”“仅在较新时复制”

enter image description here


14
注意:因此,在某些网络应用程序中,您需要添加对configSource="bin\connections.config"的引用,而不是configSource="connections.config"。 - piotrwest
我曾经遇到过同样的问题,在找到这篇文章之前,我怀疑这是一个输出复制问题。所以我先检查了app.config属性,显然它们被设置为NoneDo not copy。为什么这个设置对于ConnectionStrings.config不起作用呢? - dotNET
@dotNET 的 App.config 在构建事件期间有一个特殊的处理。如果已定义任何转换,则进行转换,重命名以匹配 exe 名称,并作为 msbuild 任务的一部分复制到输出文件夹中。 - Oscar
我还必须将我的connections.config的“Build Action”设置为Content……然后它实际上将其复制到了根目录(这正是我所期望的)。 - Eric Burdo
我曾经遇到过同样的问题,我正在使用自定义配置部分。问题出在我指定的路径是相对于 app.config 文件的,但为了使其正常工作,路径应该是相对于 <dllname>.dll.config 位置的。这样修复了问题。以前的位置无法找到该文件。 - Ashutosh Singh

3

我曾经遇到过同样的问题,Oded的解决方法对我很有用。但是我想要强调一下,要找到如何将“复制到输出目录选项”更改为“仅在较新或始终复制”,您需要:

  • 右键单击文件
  • 选择属性
  • 转到高级
  • 然后会看到“复制到输出目录”并选择“仅在较新或始终复制”

这对我有帮助,希望对您也有帮助。


如果您正在使用分类属性面板,请前往高级选项。 - evry1falls

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