1

我有一个 ASP.NET/Razor 3 Web 应用程序,它通过 MS EntityFramework 使用 SQL Server 数据库。

如果/当我想更改数据库连接字符串,例如更改密码或指向不同的数据库(例如测试与实时),则需要在项目中三个不同 XML 配置文件中的大约七个位置替换字符串(app.config、web.config 和 app.release.config),这是一个容易出错的问题。

更糟糕的是,未处理异常的默认 Web 服务器行为可能包括向 Web 用户显示配置文件的部分,这实际上导致 Web 服务器在 Web 上显示显示数据库路径和密码的行。不好。

出于这两个原因,并且因为这不是任何人都可以在服务器上编辑配置文件的产品(任何更改几乎,也可能是构建操作),我更喜欢拥有数据库连接信息编译到 Web 应用程序中并从代码而不是配置文件加载,并且能够做到这一点,以便当我想更改数据库信息时,我可以在一个地方而不是七个地方完成。

我将如何实现这一目标?

4

3 回答 3

5

数据库连接字符串可以集中设置在 Global.asax.cs 文件中的一个位置,作为应用程序状态的一部分,然后从项目中的其他任何地方引用。

步骤 1:将连接字符串定义为 Global.asax.cs 中的静态变量:

namespace TestProject
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static string ConnectionString1;
        public static string ConnectionString2;

        protected void Application_Start()
        {
            #region Build application state for the app-specific items needed by us
            ConnectionString1 = "Server=yourserver;Database=yourdb;etc etc";
            ConnectionString2 = "Server=yourserver;Database=yourdb;etc etc";
            #endregion


            #region Code auto-generated and needed by system - do not change
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
            #endregion
        }
    }
}

第 2 步:使用项目中其他任何地方的字符串:

string cnxStr1 = TestProject.MvcApplication.ConnectionString1;
string cnxStr2 = TestProject.MvcApplication.ConnectionString2;

(请注意,默认情况下,字符串只能从同一项目中访问。如果您需要在同一解决方案中使用来自任何其他项目的字符串,则需要添加对该项目的引用。)

于 2013-10-03T01:33:43.043 回答
1

如果您不想将连接字符串放在全局文件中,您可以:

  1. 为连接字符串创建一个单独的 .config 文件。例如connectionStrings.config。
  2. 创建指向此文件或包含此文件的文件夹的硬链接,该文件与您的其他 application.config 和 web.config 文件位于同一目录中。
  3. 在每个 app.config 或 web.config 中的 connectionStrings 元素上设置 configSource 属性。

从那时起,您只有一个地方来管理应用程序之间通用的连接字符串。

硬链接的原因是 configSource 必须引用包含应用程序配置的文件夹的同一文件夹或子文件夹中的文件。

请注意,更改连接字符串将回收所有使用它们的 Web 应用程序池。对于控制台、桌面和服务应用程序,您必须重新启动才能使更改生效。

对于您描述的第二个问题,您可以为每个环境创建一个单独的 connectionStrings.config 文件:开发、测试、生产。使用配置转换或其他一些过程,您只需更新每个 connectionString 元素中的 configSource 属性即可切换环境。

于 2013-10-09T15:06:55.153 回答
1

上面克里希纳的回答非常好。对我来说,我个人更喜欢将它们作为静态字符串放在静态类中,并在需要的地方使用它。

于 2013-10-09T15:05:41.600 回答