将ConnectionStrings存储在MVC应用程序之外

时间:2015-03-10 10:13:41

标签: c# asp.net-mvc entity-framework model-view-controller

我正在开发一个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构造函数,我有一个可行的解决方案。

1 个答案:

答案 0 :(得分:2)

正如Ewan所说,您可以使用machine.config文件来实现此目的。您还可以使用root web.config文件。这两个文件都位于%WinDir%\Microsoft.NET\Framework[64]\[FrameworkVersion]\Config\目录中。

应用程序web.config文件将覆盖计算机级文件中的任何设置。因此,解决方案是从您部署的应用程序web.config文件中排除连接字符串,以便应用程序从机器级文件中提取它们。