【问题标题】:Asp.net Multi Tenancy implementation on existing solution在现有解决方案上实施 Asp.net 多租户
【发布时间】:2019-10-15 21:47:25
【问题描述】:

我有一个 asp.net MVC 解决方案,首先是实体框架代码,它有几十个数据库表,都是围绕使用该解决方案的一家公司设计的。

要求允许多家公司使用该解决方案,因此我们所做的就是将“CompanyID”作为列添加到所有数据库表中并设置默认值。有一个包含各种公司名称和 CompanyID 的公司表。登录时,用户选择他们正在登录的公司,该公司将 CompanyID 存储在会话中。

现在每个实体框架调用都必须更新以包含 CompanyID,例如在选择我正在做的员工时:

List<Employee> employees = db.Employees.Where(x => x.CompanyID = Session.CompanyID).ToList();

如您所见,在数千次调用数据库时执行此操作会很乏味。任何更新、保存和获取都必须更改。

当然,我正在做很长的路要走,并且在运行时有一种方法可以在全局范围内附加所有数据库调用以包含存储在登录用户会话中的 CompanyID?在获取值或存储等时动态附加 CompanyID 的东西?也许我可以在运行时使用一个包来完成这项任务?

【问题讨论】:

  • 对于这种情况,为什么不每个公司使用一个数据库?可能没有重叠,那么为什么将它们全部放在一个数据库中呢?设置连接字符串(基于 url、声明或其他内容)更容易..
  • 如果您采用“每个公司的数据库”路线,请确保您制定了如何管理所有数据库、保持其架构相同、更新它们、管理备份等的计划。它花了我们花了一段时间来开发工具来做这件事,但是我的公司现在有 9K 具有相同架构的数据库,这并不像您想象的那么令人头疼。如果没有工具,那将是一场噩梦。
  • 感谢 cmets,我不能为每个公司做一个数据库的原因是因为公司将在运行中创建,一旦启动我的客户端将有一个添加公司和用户的界面,应该允许公司立即登录。这将需要开发人员每次都创建数据库不是这样吗?
  • @mason 如果是这样,那么我可以这样做并在登录时选择要使用的连接字符串?
  • 是的,当然。以任何最佳方式工作取决于您的应用程序。因此,请确定您的需求是什么以及最适合这些需求的设计。

标签: asp.net asp.net-mvc


【解决方案1】:

在我看来,没有必要将CompanyID 添加到数据库中的每个表中。我会为此选择“根”表/实体。例如,EmployeeDepartment 显然听起来像是与公司的多对一关系 - 所以添加 CompanyID 听起来不错。但是,例如,与 Employee 是多对一关系的 EmployeeEquipment 不必具有 CompanyID 列,因为它可以通过连接的 Employee 表进行过滤。

关于您在全球范围内按 CompanyID 过滤的请求,我不知道每个请求都可以执行此操作。实体框架有全局过滤器,但我不确定如何按请求应用它们。如果您使用的是 Entity Framework Core,请查看 .HasQueryFilter() during model creation

【讨论】:

  • 感谢您的回复,不幸的是,数十个表/模型需要更新以包含 CompanyID,因为其中许多获取与单个登录员工无关的记录,仍然需要数百个调用被修改以包括每个公司的标识符。登录的用户不仅可以查看与他们相关的记录,还可以查看公司范围内的记录。
猜你喜欢
  • 2013-10-14
  • 2015-04-01
  • 1970-01-01
  • 2011-02-12
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多