我正在开发一个MVC5应用程序,并且要求所有环境配置都存储在应用程序之外,以便在环境之间进行简单部署。即进行更改时,复制一堆文件,不要担心覆盖web.config。
我已将所有可配置的设置移动到一个工作正常的SQL表,但是,我正在努力将Connectionstrings移到web.config之外。
我在C#MVC应用程序中使用EntityFramework。我也在使用ELMAH进行错误处理。
我尝试从Global.asax执行以下操作,但EntityFramework抱怨连接字符串不在文件中:
private static void SetConnectionString(string connectionStringName, string connectionString)
{
var settings = ConfigurationManager.ConnectionStrings;
var element = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
var collection = typeof(ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
element.SetValue(settings, false);
collection.SetValue(settings, false);
settings.Add(new ConnectionStringSettings(connectionStringName, connectionString));
collection.SetValue(settings, true);
element.SetValue(settings, true);
}
是否可以覆盖Entity框架使用的配置管理器?
编辑:解决方案。
所以解决方案实际上非常简单。当我使用Code First EF时,我实际上可以将连接字符串传递给构造函数:
public AdventureWorksDb(string connectionString) : base(connectionString) { }
因此,结合使用两者,从XML加载连接字符串并在运行时修改ConnectionStrings Collection,然后将正确的连接字符串传递给DBContext构造函数,我有一个可行的解决方案。
答案 0 :(得分:2)
正如Ewan所说,您可以使用machine.config文件来实现此目的。您还可以使用root web.config文件。这两个文件都位于%WinDir%\Microsoft.NET\Framework[64]\[FrameworkVersion]\Config\
目录中。
应用程序web.config文件将覆盖计算机级文件中的任何设置。因此,解决方案是从您部署的应用程序web.config文件中排除连接字符串,以便应用程序从机器级文件中提取它们。