【发布时间】:2014-09-16 20:11:19
【问题描述】:
我的情况是,我有一个 SQL Server 数据库(称为我的“登录”数据库),其中包含许多客户端的记录,最重要的是该客户端的数据库名称。我的这个网络应用程序的登录屏幕也有标准的用户名和密码字段以及一个“唯一 ID”字段。问题就出在这里:尝试清除这里有一个示例。
我的数据库结构
-
Logins(这里是客户的唯一登录代码和他们的数据库名称) Customer_1Customer_2- 等等……
要求
登录后,我需要根据登录数据库验证客户的唯一代码,然后以某种方式坚持这样一个事实,即在经过身份验证的会话期间的进一步查询必须针对他们自己的数据库运行,这就是我被卡住的地方。
首先,这可能吗?我不想为每个可能的客户端数据库存储一个连接字符串 - 我想在登录时解决这个问题。
其次,如果可能的话,我将如何使用 Entity Framework 和 ASP.NET MVC4 来做到这一点?
【问题讨论】:
-
数据库的超集是静态的吗?也就是说,您能否生成多个 EF 数据上下文并只使用应用程序中需要的那个?如果数据库本质上是相同的,只是租户不同,那么这听起来像是一个不正确的设计,但这样的事情很容易有法律原因。在这种情况下,您可以使用不同的连接字符串(无论您在哪里获得该字符串)实例化一个新的数据上下文。另一个想法可能是将其他数据库视为服务而不是 EF 上下文,前提是它们只为应用程序提供最少的支持。
-
数据库在结构上确实相同,但您是对的,出于法律原因,它们必须分开。我希望能够将所有数据存储在一个数据库中,但不幸的是,这不是一个选择。听上去,当验证唯一的客户端代码时,我需要实例化一个新的数据上下文,但我不完全确定如何在会话期间持久保存它(请记住建议使用 Session 的人数state 在 MVC 中是一个非常糟糕的主意(我能理解为什么))
-
这很有趣。我曾经工作过的地方希望能够将数据保存在单独的数据库中,因为它对于一个客户来说太大了,以至于它会减慢其他所有人的速度。
-
这里有一些不错的提示:stackoverflow.com/questions/14440698/…
-
在这种情况下,您可能会尝试将连接字符串作为值存储在用于初始登录和用户识别的“主”数据库中。一旦确定,您将获得他们数据库的连接字符串,然后应用程序将使用该连接字符串来初始化新的数据上下文。也许有一个创建数据上下文的工厂,并且该工厂有一个设置静态连接字符串的方法?
标签: c# sql-server entity-framework asp.net-mvc-4