Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何在源代码中的一个位置替换配置文件数据库链接?(asp.net/razor)_Asp.net Mvc 3_Razor_Web Config_Connection String - Fatal编程技术网

Asp.net mvc 3 如何在源代码中的一个位置替换配置文件数据库链接?(asp.net/razor)

Asp.net mvc 3 如何在源代码中的一个位置替换配置文件数据库链接?(asp.net/razor),asp.net-mvc-3,razor,web-config,connection-string,Asp.net Mvc 3,Razor,Web Config,Connection String,我有一个ASP.NET/Razor 3 web应用程序,它通过MS EntityFramework使用SQL Server数据库 如果/当我想要更改数据库连接字符串,例如更改密码或指向其他数据库(例如,test vs.live),则需要在项目中三个不同XML配置文件(app.config、web.config和app.release.config)中的大约七个位置替换该字符串,这是一个容易出错的问题 更糟糕的是,未处理异常的默认web服务器行为可能包括向web用户显示配置文件的部分,这实际上导致

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

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

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

出于这两个原因,并且由于这不是一个任何人都会在服务器上编辑配置文件的产品(任何更改都是构建操作),因此我更希望将数据库连接信息编译到web应用程序中,并从代码加载,而不是从配置文件加载,为了能够做到这一点,当我想要更改数据库信息时,我可以在一个地方而不是七个地方进行更改


如何实现这一点?

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

步骤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;

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

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

步骤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;

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

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

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

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

  • 为连接字符串创建单独的.config文件。例如 connectionStrings.config
  • 创建指向此文件或 包含此文件的文件夹,该文件与您的 其他application.config和web.config文件
  • 在每个app.config或中的ConnectionString元素上设置configSource属性 web.config
  • 从那时起,您只有一个地方可以管理应用程序之间常见的连接字符串

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

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


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

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

  • 为连接字符串创建单独的.config文件。例如 connectionStrings.config
  • 创建指向此文件或 包含此文件的文件夹,该文件与您的 其他application.config和web.config文件
  • 在每个app.config或中的ConnectionString元素上设置configSource属性 web.config
  • 从那时起,您只有一个地方可以管理应用程序之间常见的连接字符串

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

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


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

    回答得很好。遗憾的是,行动组懒得颁发赏金。是的,我同意,很抱歉我没能颁发赏金,因为一场大灾难让我忘记了这个问题,而且似乎有一个最后期限(?)来颁发赏金?我现在才开始回到这个问题上,稍后会查看这个和另一个答案,看看我是否能让它们发挥作用。没问题,@Dronz!我希望事情已经解决了,现在一切都恢复正常了。回答得好。遗憾的是,行动组懒得颁发赏金。是的,我同意,很抱歉我没能颁发赏金,因为一场大灾难让我忘记了这个问题,而且似乎有一个最后期限(?)来颁发赏金?我现在才开始回到这个问题上来,我会检查一下