【问题标题】:asp.net mvc multiple connection stringsasp.net mvc 多个连接字符串
【发布时间】:2011-06-27 11:14:43
【问题描述】:

我正在使用 MVC 3.0 创建 asp.net MVC 应用程序。我有 2 个用户,但数据库是相同的。那么,是否可以在 web.config 中设置两个或更多连接字符串?当用户登录时,我将其重定向到他的数据库,这样他就可以使用他的数据库了。

所以这里的主要问题是找出哪个用户已登录并为该用户使用连接字符串。

我正在使用默认的 mvc 帐户控制器,例如,当我想在我的视图中为用户显示欢迎消息时,我输入: if (@User.Identity.Name == "UserName") then some message 那么找出哪个用户登录并在控制器或视图中设置他的连接字符串的最佳位置在哪里?

【问题讨论】:

    标签: asp.net asp.net-mvc-3 connection-string


    【解决方案1】:

    是的,您可以在 web.config 文件中包含任意数量的连接字符串。

    但是,如果您正在设计一个多租户应用程序,那么有比每次新用户注册时向 web.config 文件添加连接字符串更好的方法。

    对您来说最好的方法可能是拥有一个数据库,其中与用户相关的表具有Users 表的外键。

    您可以从thisMicrosoft 文章中了解有关多租户架构的更多信息。

    【讨论】:

    • 这就是我最初的意图,就像你说的那样,一切都是一个带有用户相关表的数据库。我将尝试探索有关访问那些我有点好奇的多个连接字符串的一点点:)
    • 添加了微软文章的链接
    【解决方案2】:

    我同意 Jakub 的回答:there are better ways of handling multi-tenancy than having a different database per user。

    但是,要回答您的具体问题,我想到了两个选项:

    1. 您可以在登录后立即将连接字符串设置为会话变量。
    2. 您的数据访问层可以在创建时根据登录用户选择连接字符串。 (我会推荐这个而不是第一个选项)

      1. 要在登录后存储连接,如果您使用的是标准 ASP.NET MVC 帐户控制器,请查看 LogOn 发布操作:

        [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    //EXAMPLE OF WHERE YOU COULD STORE THE CONNECTION STRING
                    Session["userConnectionString"] = SomeClass.GetConnectionStringForUser(model.UserName);
        
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "The user name or password provided is incorrect.");
                }
            }
        
            // If we got this far, something failed, redisplay form
            return View(model);
        }
        
      2. 如果您想在进行数据访问时选择连接字符串,您的存储库或数据访问层可能会有一个系统来处理它。例如,使用 Entity Framework Code First,the DbContext constructor 允许您在创建连接字符串时传入它的名称:

      connectionString = SomeClass.GetConnectionStringForUser(model.UserName); DbContext 上下文 = 新 DbContext(connectionString);

    但同样,我会考虑其他处理多租户的方法,除非您的业务要求您的用户拥有物理上独立的数据库。

    【讨论】:

    • 谢谢 Jon,是的,第一个问题是物理上分离的数据库,这让我很生气,我必须进行大量的实验才能让它顺利进行。回到问题,我计划在用户登录时以某种方式检索 conn 字符串名称,但我想知道如何将我的应用程序重定向到该数据库,我的意思是为特定用户使用该 con 字符串。我先用EF代码,这两个数据库我的模型都是一样的。
    【解决方案3】:

    您可以在 web.config 中拥有多个连接字符串。现在,如果您想为不同的用户使用不同的连接字符串,则必须有一些划分用户的标准

     <appSettings><add key="connectionString" value="Data Source=develope\sqlexpress;Initial  Catalog=validation_tdsl;Integrated Security=True;Max Pool Size=1000;Connect Timeout=60000;"></add>
     <add key="connectionString1" value="server=MARK\SQLEXPRESS;database=name;integrated security=true;Max Pool Size=1000;Connect Timeout=60000;"></add>
      <add key="connectionString2" value="server=name\SQLEXPRESS;database=FM;integrated security=true;Max Pool Size=1000;Connect Timeout=60000;"></add>
    

    以后你可以像下面这样使用它们

      Dim con As New SqlConnection(System.Configuration.ConfigurationSettings.AppSettings("connectionString"))
    
     Dim con1 As New SqlConnection(System.Configuration.ConfigurationSettings.AppSettings("connectionString1"))
    

    编辑:在 c# 中是:

      SqlConnection  con = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["connectionString"]);
    
      SqlConnection  con1 = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["connectionString1"])
    

    注意:ConfigurationSettings 现已过时。

    【讨论】:

    • 嗯,我正在使用 C# 和 asp.net mvc,所以我对 VB 不太熟悉。
    • 在 c# 中类似于 sqlconnection con=new sqlconnection(System.Configuration.ConfigurationSettings.AppSettings("connectionString"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多