Entity Framework 无法在嵌套 web.config 中找到连接字符串
Entity Framework unable to find connection string in nested web.config
我是 .NET 新手,但我使用的是 EntityFramework 5.0 和 .NET 4.5
我有一个网站,其中 web.config 中的 connectionStrings 在 configSource 中维护如下:
<connectionStrings configSource="ConfigOverrides\overrideConnectionStrings.config">
</connectionStrings>
我的网站有包含嵌套 web.config 文件的模块。这些模块在嵌套的 web.config 中指定它们自己的 connectionString。一切都很好,直到我在我的 ConfigOverrides\overrideConnectionStrings 文件中放置了一个 System.Data.EntityClient 连接。在我这样做之后,我会从模块中得到一个错误:
在应用程序配置文件中找不到名为 'WebsiteEntities' 的连接字符串。
如果我将模块的 connectionString 复制到 ConfigOverrides 中的那个,我会收到一条错误消息,指出已经有一个具有该名称的连接字符串。如果我从它们的嵌套 web.config 中删除连接字符串并将其放入我的覆盖中,它就可以工作。但是我不想在该全局覆盖中维护所有模块的 connectionSettings。
overrideConnectionStrings.config 的内容:
<connectionStrings>
<add name="SqlServices" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=my_db;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\my_db.mdf;" />
<add name="TermsEntities" providerName="System.Data.EntityClient" connectionString="metadata=res://*/Terms.csdl|res://*/Terms.ssdl|res://*/Terms.msl;provider=System.Data.SqlClient;provider connection string='data source=(LocalDb)\v11.0;Initial Catalog=my_db;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\my_db.mdf;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework'" />
<add name="ADServer" connectionString="LDAP://ldap.localdomain:389/DC=company,DC=com" />
</connectionStrings>
模块的嵌套 Web.config connectionStrings 的内容:
<connectionStrings>
<add name="WebsiteEntities" connectionString="metadata=res://*/WSE.csdl|res://*/WSE.ssdl|res://*/WSE.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=WSE_DB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="RoutingConn" providerName="System.Data.SqlClient" connectionString="data source=.;initial catalog=WSE_DB;integrated security=True;" />
</connectionStrings>
我应该注意到,在我将我的 TermsEntities 添加到主站点的 web.config(通过 ConfigOverrides)之前,该模块工作正常。
我仍然无法弄清楚我的应用程序设置中是什么导致找不到 connectionString。在调试时,我可以查看可用于请求路径的 connectionStrings,并且我会看到所有 connectionStrings(嵌套 web.config 中的那些和根 web.config 中的那些)。
我的解决方法是仅使用 System.Configuration 中的 ConfigurationManager 并读入连接字符串:
public partial class WebsiteEntities : DbContext
{
public WebsiteEntities()
: base(ConfigurationManager.ConnectionStrings["WebsiteEntities"].ConnectionString ?? "name=WebsiteEntities")
{
}
...
这似乎有效。
我是 .NET 新手,但我使用的是 EntityFramework 5.0 和 .NET 4.5 我有一个网站,其中 web.config 中的 connectionStrings 在 configSource 中维护如下:
<connectionStrings configSource="ConfigOverrides\overrideConnectionStrings.config">
</connectionStrings>
我的网站有包含嵌套 web.config 文件的模块。这些模块在嵌套的 web.config 中指定它们自己的 connectionString。一切都很好,直到我在我的 ConfigOverrides\overrideConnectionStrings 文件中放置了一个 System.Data.EntityClient 连接。在我这样做之后,我会从模块中得到一个错误:
在应用程序配置文件中找不到名为 'WebsiteEntities' 的连接字符串。
如果我将模块的 connectionString 复制到 ConfigOverrides 中的那个,我会收到一条错误消息,指出已经有一个具有该名称的连接字符串。如果我从它们的嵌套 web.config 中删除连接字符串并将其放入我的覆盖中,它就可以工作。但是我不想在该全局覆盖中维护所有模块的 connectionSettings。
overrideConnectionStrings.config 的内容:
<connectionStrings>
<add name="SqlServices" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=my_db;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\my_db.mdf;" />
<add name="TermsEntities" providerName="System.Data.EntityClient" connectionString="metadata=res://*/Terms.csdl|res://*/Terms.ssdl|res://*/Terms.msl;provider=System.Data.SqlClient;provider connection string='data source=(LocalDb)\v11.0;Initial Catalog=my_db;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\my_db.mdf;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework'" />
<add name="ADServer" connectionString="LDAP://ldap.localdomain:389/DC=company,DC=com" />
</connectionStrings>
模块的嵌套 Web.config connectionStrings 的内容:
<connectionStrings>
<add name="WebsiteEntities" connectionString="metadata=res://*/WSE.csdl|res://*/WSE.ssdl|res://*/WSE.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=WSE_DB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="RoutingConn" providerName="System.Data.SqlClient" connectionString="data source=.;initial catalog=WSE_DB;integrated security=True;" />
</connectionStrings>
我应该注意到,在我将我的 TermsEntities 添加到主站点的 web.config(通过 ConfigOverrides)之前,该模块工作正常。
我仍然无法弄清楚我的应用程序设置中是什么导致找不到 connectionString。在调试时,我可以查看可用于请求路径的 connectionStrings,并且我会看到所有 connectionStrings(嵌套 web.config 中的那些和根 web.config 中的那些)。
我的解决方法是仅使用 System.Configuration 中的 ConfigurationManager 并读入连接字符串:
public partial class WebsiteEntities : DbContext
{
public WebsiteEntities()
: base(ConfigurationManager.ConnectionStrings["WebsiteEntities"].ConnectionString ?? "name=WebsiteEntities")
{
}
...
这似乎有效。