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