这是根据用户选择数据库的好方法吗?

时间:2014-03-27 23:41:19

标签: c# entity-framework

我正在使用ASP.NET MVC + WebAPI + AngularJS开发一个系统,它具有以下属性:用户可以登录,不同的用户拥有完全不同的数据。原因很简单:系统允许管理数据,但尽管每个人的架构都相同,但用户之间的数据完全断开。即使由于组织,一致性和安全性,每个用户也需要一个单独的数据库。

这引起了一个问题:虽然每个数据库应该是相同的,即相同的表和列,因此相同的EF数据上下文,但连接是不同的。这让我感到困惑,因为我习惯于在配置XML文件上指定连接字符串,这在此处无法完成,因为连接字符串是动态的。

然后我考虑了一个解决方案,如果它是最好的解决方案,我现在不会这样做:我创建了一个存储库,在其构造中接收登录用户的用户名。然后,存储库进入系统的数据库并查找该登录用户的连接数据(当用户注册时将通知该数据)。然后,存储库构建连接字符串并将其提供给DbContext

这是解决这个问题的好方法吗?或者有更多推荐的方法来处理这种事情?安全是这里的一个重要问题,因此我不确定我的方法。

3 个答案:

答案 0 :(得分:2)

实体框架解决方案中的每个数据上下文都有一个构造函数重载,允许您指定连接字符串。您可以在下面的链接中找到如何构建和使用该连接字符串。

<强>参考
How to: Build an EntityConnection Connection String

尽管如此,除非你有非常特殊的要求,否则从维护和操作的角度来看,只需将UserID放在适当的表中,并过滤当前登录的用户ID就好了。

答案 1 :(得分:0)

每个用户一个数据库对我来说似乎是一个疯狂的解决方案。

在包含每个用户数据的表格中加入user_id列,并对其进行适当过滤。

答案 2 :(得分:0)

我认为这取决于您的每用户数据库的复杂程度。如果我们讨论5-10个表,那么为所有表添加,管理和查询添加ID列比管理多个数据库更容易。但是模型越复杂,数据库中的表就越多,那么每个用户只有一个数据库就好了,而每个表只有一个列,并且必须将用户检查添加到所有查询中。特别是更复杂的。

性能相同。如果您希望用户数据库的数据量增大,那么拥有单独的数据库可以让您通过将不同的数据库放入不同的服务器来横向扩展。

如果用户请求对其数据进行原始访问,共享数据库也会出现问题。它可能发生,例如,当他们想要迁移数据时。