1. 结论
UnitOfWorkManager.Current.SetTenantId()
修改的是ABP
过滤器中使用的TenantId
,并不会修改AbpSession.TenantId
代码演示:
2. 关于UnitOfWorkManager.Current.SetTenantId()
方法的作用
-
前提:
ABP
框架是是支持多租户的,对于单数据库的多租户设计,需要通过TenantId
来区分宿主和租户,并且ABP
支持自动过滤租户数据(详情请查阅官方文档) -
当执行一个数据库查询(如:
_deviceRepository.GetAll();
)时,会自动取AbpSession.TenantId
添加到查询条件中,而UnitOfWorkManager.Current.SetTenantId(_tenantId)
的之后,ABP
的过滤器会优先使用_tenantId
,但AbpSession.TenantId
不会改变 -
如果在添加/修改的时候,需要用到
SetTenantId
之后的_tenantId
怎么办呢?反正是不能直接用AbpSession.TenantId
- 两个办法:
- 使用
UnitOfWorkManager.Current.GetTenantId()
获取; - 直接使用
_tenantId
变量
- 使用
- 两个办法:
3. 通常使用方式
通常和using
一起使用,在using
语句块运行完后,过滤器会自动从AbpSession.TenantId
取租户Id,如果没有特殊需求,推荐此用法
public async Task<List<Device>> GetDevices(int tenantId)
{
using (UnitOfWorkManager.Current.SetTenantId(tenantId))
{
return _deviceRepository.GetAllAsync(); //使用的是tenantId过滤
}
}
4. 优点
- 不需要手动写
TenantId
查询条件,尤其是涉及到多个查询的时候,优点更为明显 - 配合
using
使用,可以灵活查询不同租户Id的数据