Asp.net MVC 4 动态连接字符串

Asp.net MVC 4 dynamic connection string

我正在学习 Asp.net mvc 4 并正在修改一个 asp.net mvc 4 项目。

目前每个项目的web.config中都设置了数据库的连接。该项目使用 entity framework,我也在努力理解(我来自 java Apache Wicket 背景)。

我想要做的是为每个环境(本地、开发、测试、生产等)创建一个 属性 文件,并配置 属性 文件中的连接字符串以使用与该环境相关的数据库连接信息。

我已经看到了一些关于此的主题,Here and here。但是我不知道 Asp.net MVC 足以理解 C# class 我应该更改连接字符串。

最好的方法是什么?我开始使用 appSettings 的外部文件,但是当我不知道如何使用 appSetting key/value.

动态更改 web.config 时卡住了

我正在修改的这个应用程序有多个项目,有多个连接字符串。我将 EF 视为采用连接字符串的重载构造函数,但我看不到此构造函数的使用位置。所以现在,我只想了解一些如何动态修改连接字符串。我将在项目中的什么地方执行此操作?

对于那些也在寻找此问题解决方案的人,这是我的解决方案(这只是一种可能的解决方案)。

在我的 Web.config class 中,我为我的连接字符串使用了一个配置源:

<connectionStrings configSource="connections.config"/> 

然后我用静态方法在我的 App_Start 文件夹中创建了一个 class:

    public static void CloneEnvironmentConfigSource()
    {
        String path = AppDomain.CurrentDomain.BaseDirectory;
        Debug.WriteLine("Path = " + path);

        try
        {
            File.Copy(path + @"..\EnvironmentConfig\connections.config", path + @"connections.config", true);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            throw ex;
        }
    }

我在 Global.asax.cs 文件的 Application_Start() 中调用了这个方法...像这样:

    public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ConnectionStringBuilder.CloneEnvironmentConfigSource();

基本上我在环境中有一个文件夹,我将 "deploying" 我的应用程序存储我的 configSource 文件以复制到项目中以供 Web.config 参考。

我不得不求助于此,因为 configSource url 映射不允许您转到其自身之上的目录。因此,这使我可以将我的项目部署到任何环境,而不必担心更改用于开发或测试的连接字符串信息。

希望这对某人有所帮助,如果此解决方案将来会出现问题或有人认为会有负面影响,请告诉我。

*** 只是更新。我遇到了 Application_Start() 被多次调用并减慢我​​的应用程序的问题。我认为这是因为此时 Web.config 被更改,框架已经加载了 web.config,所以它进行更改并重新加载所有内容。

我必须做的是 ConnectionStringBuilder.CloneEnvironmentConfigSource();从 Application_Start() 中取出并放入 AssemblyInfo.cs 中:

//Called to set config file dynamicaly used by Web.config file to set  connectionstring. 
//Has to be one of the first methods ran to avoid reload of Web.config  after changes are made.
[assembly: PreApplicationStartMethod(
  typeof(ConnectionStringBuilder), "CloneEnvironmentConfigSource")]

这样它会先 运行 。