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

时间:2015-05-21 13:55:22

标签: asp.net-mvc-4 dynamic connection-string

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

目前,与数据库的连接是在每个项目的web.config中设置的。该项目使用实体框架,我仍然试图理解(我来自Java Apache Wicket背景)。

我想要做的是为每个环境(本地,开发,测试,生产等)提供属性文件,并从属性文件配置connectionstring以使用该环境附属的数据库连接信息。

我已经看到了一些相关话题,Herehere。但我不知道Asp.net MVC足以理解我应该更改连接字符串的C#类。

最好的方法是什么?我开始使用appSettings的外部文件,但是当我不知道如何使用appSetting键/值动态更改web.config时,卡住了。

我正在修改的这个应用程序有多个项目,有多个连接字符串。我看到EF是一个重载的构造函数来获取连接字符串,但我没有看到这个构造函数的使用位置。所以现在,我想要一些动态修改连接字符串的方法。我会在项目中的哪个位置执行此操作?

1 个答案:

答案 0 :(得分:3)

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

在我的Web.config类中,我使用configSource作为我的连接字符串:

<connectionStrings configSource="connections.config"/> 

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

    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();

基本上我在环境中有一个文件夹我将“部署”我的应用程序,将我的configSource文件存储到项目中以供Web.config引用。

我不得不求助于此,因为configSource url映射不允许你进入上面的目录。因此,这允许我将项目部署到任何环境,而不必担心更改dev或test的连接字符串信息。

希望这有助于某人,如果此解决方案将来会出现问题,或者有人认为会产生负面影响,请告知我们。

***只是一个更新。我遇到了一个问题,其中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")]

这样它会在其他任何东西之前运行。