【问题标题】:Store ConnectionStrings outside of MVC application在 MVC 应用程序之外存储 ConnectionStrings
【发布时间】:2015-05-11 17:29:51
【问题描述】:

我正在开发一个 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 集合,然后将正确的连接字符串传递给 DBContext 构造函数,我有一个可行的解决方案。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我没有想到这么好的主意。我没有提到的一件事,因为我认为它不相关(我现在已经更正了)是我有多个应用程序以不同的 SQL 权限运行,它们都使用同一个数据库。我想出了一个解决方案,并将其添加到我的问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2012-10-10
    • 2013-02-10
    • 1970-01-01
    • 2012-10-26
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多