我正在学习Asp.net mvc 4工作并修改asp.net mvc 4项目。
目前,与数据库的连接是在每个项目的web.config中设置的。该项目使用实体框架,我仍然试图理解(我来自Java Apache Wicket背景)。
我想要做的是为每个环境(本地,开发,测试,生产等)提供属性文件,并从属性文件配置connectionstring以使用该环境附属的数据库连接信息。
我已经看到了一些相关话题,Here和here。但我不知道Asp.net MVC足以理解我应该更改连接字符串的C#类。
最好的方法是什么?我开始使用appSettings的外部文件,但是当我不知道如何使用appSetting键/值动态更改web.config时,卡住了。
我正在修改的这个应用程序有多个项目,有多个连接字符串。我看到EF是一个重载的构造函数来获取连接字符串,但我没有看到这个构造函数的使用位置。所以现在,我想要一些动态修改连接字符串的方法。我会在项目中的哪个位置执行此操作?
答案 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")]
这样它会在其他任何东西之前运行。