多租户
多租户功能是一种软件架构技术,允许多个用户或租户共享同一个应用程序实例,同时保持数据隔离。这意味着每个租户都可以根据需求配置和使用自己的应用程序实例,而不会与其他租户的数据产生冲突或混淆。
在Obase中启用多租户非常简单,我们可以使用类型标注或属性标注实现
安装扩展包
dotnet add Obase.MultiTenant
类型标注
使用MultiTenant特性标注哪个属性为逻辑删除:
[MultiTenant("MultiTenantId",typeof(Guid))]
public class Student {
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public Guid MultiTenantId
{
get => _multiTenantId;
set => _multiTenantId = value;
}
}
属性标注
使用MultiTenantMark标记在属性上表示当前字段为逻辑删除字段
public class Student {
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
[MultiTenantMark]
public Guid MultiTenantId
{
get => _multiTenantId;
set => _multiTenantId = value;
}
}
启用多租户
/// <summary>
/// 配置模型
/// </summary>
/// <param name="modelBuilder"></param>
/// <exception cref="NotImplementedException"></exception>
protected override void CreateModel(ModelBuilder modelBuilder)
{
//启用多租户
modelBuilder.UseMultiTenant();
}
无字段使用多租户
在升级项目时,如果旧实体模型中没有多租户字段,我们可以通过无字段使用多租户来实现这一需求。要使用无字段使用多租户,我们需要在CreateModel()方法中进行相应的配置。通过这样的配置,框架在执行时会自动向数据库添加使用多租户字段(自动添加需要设置EnableStructMapping=true,如果数据库存在字段则会跳过),从而实现了逻辑删除的功能。这种方式的优点在于,它不需要对原始模型进行修改,而是在运行时动态添加所需的字段,使得升级过程更加灵活和方便。
protected override void CreateModel(ModelBuilder modelBuilder)
{
var multiTenantSchoolNodef = modelBuilder.Entity<MultiTenantSchoolNoDef>();
multiTenantSchoolNodef.HasKeyAttribute(p => p.SchoolId).HasKeyIsSelfIncreased(true);
//创建多租户扩展
var multiTenantExtNodef1 = multiTenantSchoolNodef.HasExtension<MultiTenantExtensionConfiguration<MultiTenantSchoolNoDef>>();
//当类中未定义多租户字段时 需要指定字段设置字段和类型
multiTenantExtNodef1.HasTenantIdField("MultiTenantId",typeof(Guid));
}
使用多租户查询查询
在成功启用多租户功能后,为了自动筛选出符合多租户需求的数据,您可以在查询之前调用上下文的this.EnableMultiTenant()方法。请注意,此方法需要传入ITenantIdReader接口或Func<object>()函数作为参数。框架会自动调用这两个参数的值,以对数据进行筛选。
//模拟返回租户ID为1
this.EnableMultiTenant(() => 1);
//这个时候再查的就都是租户ID为1的数据了
var teacher = context.CreateSet<MultiTenantTeacherNoDef>().FirstOrDefault();