ABP框架中UnitOfWorkManager.Current.SetTenantId()并不是修改AbpSession.TenantId的值
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的数据
本文来自博客园,作者:汪小让,转载请注明原文链接:https://www.cnblogs.com/wangxiaorang/p/17485438.html

浙公网安备 33010602011771号