如何改造既有功能让它支持多租户功能

到目前为止,我们已经构建了功能齐全电话薄的应用程序(当然除了有点丑)。现在,我们将看到如何轻松将其转换为多租户应用程序。在进行任何代码修改前,请从当前登录注销。

在52ABP中启用多租户

在本系统文章开头,我们禁用了多租户。现在,在appsettings.json类中重新启用它:

  "MultiTenancy": { // 多租户配置
    "IsEnabled": true
  },

使实体成为多租户

在多租户应用程序中,租户的实体应该与其他租户进行隔离。对于此示例项目,每个租户都拥有自己的电话簿,并且联系人和电话号码之间是相互隔离的。

当我们实现IMustHaveTenant接口时,ABP会根据当前的TenantId自动,进行数据过滤,同时从数据库中查询实体有关的信息。因此,我们应该使用IMustHaveTenant接口声明Person实体必须具有一个租户:


[Table(AppConsts.TablePrefix + "Persons")]
public class Person : FullAuditedEntity<Guid>, IMustHaveTenant
{
    public virtual int TenantId { get; set; }

    //...其他属性
}

我们也可以将IMustHaveTenant接口也添加到Phone实体。加还是不加呢?如何进行判断呢?

答案是,如果我们会直接操作Phone这个实体的话,我们也需要添加IMustHaveTenant接口,但在当前案例项目中,我们不需要它。

由于Person实体已更改,因此我们需要创建一个新的数据库迁移:

Add-Migration "Implemented_IMustHaveTenant_For_Person"

这个命令是通过Codefirst的模式进行创建的迁移。生成的迁移类自动添加了数据过滤的信息,由于它是自动完成的,因此我们不需要知道它具体实现的过程。 它还将TenantId列添加到PbPersons表中,如下所示:


  public partial class Implemented_IMustHaveTenant_For_Person : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<int>(
                name: "TenantId",
                table: "LtmPersons",
                nullable: false,
                defaultValue: 0);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "TenantId",
                table: "LtmPersons");
        }
    }

现在我将defaultValue从0改为1,这样就会将当前已经存在的联系人信息,自动的分配给默认租户(default)它的Id始终都是1。

好了现在我们开始执行迁移命令,进行修改数据库。

Update-Database

接下里