【问题标题】:ASP .Net Entity Framework one database per userASP .Net Entity Framework 每个用户一个数据库
【发布时间】: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


【解决方案1】:

在我看来,为每个公司使用 1 个数据库是件好事。而对于用户,你需要创建一个表来存储所有用户的所有信息,它可以足够大,没关系。我建议对多个数据库使用 1 个实体:http://olivierhelin.com/blog/entity-framework/entity-framework-6-one-entity-data-model-multiple-databases-2

希望对您有所帮助。

【讨论】:

  • 感谢您的帮助 :) 这意味着我将用户放在不同的数据库中。我想以模块化的方式将它们组合在一起。无论如何,如果这可行,是否可以先使用代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多