【发布时间】:2016-03-30 13:18:03
【问题描述】:
我正在制作一个可供多家公司使用的 Web 应用程序,我希望他们每个人都有一个单独的数据库。
在登录屏幕上,用户会选择公司,然后它会转到一个单独的数据库来获取连接字符串数据。 应用程序首先使用代码,因此如果该新连接字符串尚不存在,将使用该新连接字符串创建数据库。
我的方法是将连接字符串存储在用户的 Session 中。
public MyContext() : base(MySession.Current.ConnectionString)
{
Database.SetInitializer(new MyDevDbInitializer());
}
我创建了一个默认连接字符串,以防它无法获取会话之一。 这似乎可行,但我可以看到在获取存储的请求之前,它会在每个请求上多次默认。但是数据库创建和 CRUD 操作运行良好。
我不知道我这样做是否正确,以及完成的其他请求是否重要(我认为它们是重要的),这些请求是在内部完成的,我似乎无法追踪它们。
抱歉,文字太长了。 :)
【问题讨论】:
-
我会提醒您不要自动创建数据库。我将为应用程序提供一个上下文,负责迁移到主数据库,然后为仅使用现有数据库连接的用户访问提供另一个上下文。然后,您或您的基础架构团队应在创建帐户时为用户手动创建数据库。坦率地说,无论如何,让 Web 应用程序在运行中创建数据库是很可怕的,但您还需要为连接 Web 应用程序的 SQL 用户提供完整的实例权限,这是一个很大的安全风险。
-
除了@Chris Pratt 所写的内容之外,请考虑使用 ASP 调用 base(MySession.Current.ConnectionString) 使数据访问层如此紧密。您无法控制是否创建具有错误连接字符串的上下文。此外,您将无法编写单元测试。
-
每个用户一个数据库听起来您需要认真重新考虑您的整体架构。这听起来像是一个糟糕透顶的设计......
-
我每个公司都有一个数据库,不是用户对不起。那么我应该在每个表中只有一个带有公司标识符的数据库吗?这种方式看起来更干净,但我注意到虽然我让它工作起来并不容易(大多数情况下,所有业务逻辑都工作正常并且数据库创建,只有用户部分和框架完成的其他操作没有会话)。无论如何,我开始认为这可能不是一个好习惯,因为我在网上找不到任何关于如何做到这一点的信息。
标签: c# asp.net entity-framework asp.net-mvc-4 dbcontext