添加租户(Tenants)表和 TenantId 字段

为了租户间相互独立,我们需要把 TenantId 字段添加到所有表中。

因此,我们先添加一个租户(Tenants)表。

因为 Northwind 表已经有记录,我们将定义一个 ID 为 1 的主租户,并把所有现有记录的 TenantId 设为该值。

现在是时候写迁移类,实际上有两个迁移类:一个是 Northwind ,另一个是 Default 数据库。

DefaultDB_20160110_092200_MultiTenant.cs:

  1. using FluentMigrator;
  2. namespace MultiTenancy.Migrations.DefaultDB
  3. {
  4. [Migration(20160110092200)]
  5. public class DefaultDB_20160110_092200_MultiTenant
  6. : AutoReversingMigration
  7. {
  8. public override void Up()
  9. {
  10. Create.Table("Tenants")
  11. .WithColumn("TenantId").AsInt32()
  12. .Identity().PrimaryKey().NotNullable()
  13. .WithColumn("TenantName").AsString(100)
  14. .NotNullable();
  15. Insert.IntoTable("Tenants")
  16. .Row(new
  17. {
  18. TenantName = "Primary Tenant"
  19. });
  20. Insert.IntoTable("Tenants")
  21. .Row(new
  22. {
  23. TenantName = "Second Tenant"
  24. });
  25. Insert.IntoTable("Tenants")
  26. .Row(new
  27. {
  28. TenantName = "Third Tenant"
  29. });
  30. Alter.Table("Users")
  31. .AddColumn("TenantId").AsInt32()
  32. .NotNullable().WithDefaultValue(1);
  33. Alter.Table("Roles")
  34. .AddColumn("TenantId").AsInt32()
  35. .NotNullable().WithDefaultValue(1);
  36. Alter.Table("Languages")
  37. .AddColumn("TenantId").AsInt32()
  38. .NotNullable().WithDefaultValue(1);
  39. }
  40. }
  41. }

我已经在用户(user)表所在的 Default 数据库创建租户(Tenants)表,并在该表添加 3 个预定义的租户。实际上我们只需要 ID 为 1 的第一个租户。

我们没有在一些表(如 UserPermissions、UserRoles、RolePermissions 等)添加 TenantId 列,因为他们可以通过 UserId 或 RoleId 获取 TenantId 信息。

NorthwindDB_20160110_093500_MultiTenant.cs:

  1. using FluentMigrator;
  2. namespace MultiTenancy.Migrations.NorthwindDB
  3. {
  4. [Migration(20160110093500)]
  5. public class NorthwindDB_20160110_093500_MultiTenant
  6. : AutoReversingMigration
  7. {
  8. public override void Up()
  9. {
  10. Alter.Table("Employees")
  11. .AddColumn("TenantId").AsInt32()
  12. .NotNullable().WithDefaultValue(1);
  13. Alter.Table("Categories")
  14. .AddColumn("TenantId").AsInt32()
  15. .NotNullable().WithDefaultValue(1);
  16. Alter.Table("Customers")
  17. .AddColumn("TenantId").AsInt32()
  18. .NotNullable().WithDefaultValue(1);
  19. Alter.Table("Shippers")
  20. .AddColumn("TenantId").AsInt32()
  21. .NotNullable().WithDefaultValue(1);
  22. Alter.Table("Suppliers")
  23. .AddColumn("TenantId").AsInt32()
  24. .NotNullable().WithDefaultValue(1);
  25. Alter.Table("Orders")
  26. .AddColumn("TenantId").AsInt32()
  27. .NotNullable().WithDefaultValue(1);
  28. Alter.Table("Products")
  29. .AddColumn("TenantId").AsInt32()
  30. .NotNullable().WithDefaultValue(1);
  31. Alter.Table("Region")
  32. .AddColumn("TenantId").AsInt32()
  33. .NotNullable().WithDefaultValue(1);
  34. Alter.Table("Territories")
  35. .AddColumn("TenantId").AsInt32()
  36. .NotNullable().WithDefaultValue(1);
  37. }
  38. }
  39. }