我正在使用MVC 3.0创建asp.net MVC应用程序。我有2个用户,但DataBase是相同的。那么,是否可以在web.config中设置两个连接字符串甚至更多?当用户登录时,我将其重定向到他的数据库,这样他就可以使用他的数据库了。
这里的主要问题是找出登录的用户并为该用户使用连接字符串。
我正在使用默认的mvc帐户控制器,例如当我想在我的视图中显示用户的欢迎消息时,我输入:if(@ User.Identity.Name ==“UserName”)然后是一些消息 那么找出哪个用户登录并在控制器或视图中设置其连接字符串的最佳位置在哪里?
答案 0 :(得分:2)
是的,您可以根据需要在web.config文件中包含尽可能多的连接字符串。
但是,如果您正在设计一个多租户应用程序,那么每次新用户注册时,只要有更好的方法来添加连接字符串到web.config文件。
对您而言,最好的方法可能是拥有一个数据库,其中与用户相关的表具有Users
表的外键。
您可以从this Microsoft文章了解有关多租户架构的更多信息。
答案 1 :(得分:1)
你可以在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现已过时。
答案 2 :(得分:1)
我同意Jakub的回答:there are better ways of handling multi-tenancy than having a different database per user。
但是,要回答您的具体问题,我会想到两个选项:
您的数据访问层可以根据登录用户创建时选择连接字符串。 (我建议第一个选项)
要在登录后存储连接,如果您使用的是标准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);
}
如果您想在进行数据访问时选择连接字符串,您的存储库或数据访问层可能会有一个系统来处理它。例如,使用Entity Framework Code First,the DbContext constructor允许您在创建连接字符串时传递连接字符串的名称:
connectionString = SomeClass.GetConnectionStringForUser(model.UserName); DbContext context = new DbContext(connectionString);
但是,除非您的业务要求您的用户在物理上分开数据库,否则我会考虑处理多租户的其他方式。