首页 > 其他分享 >ABP框架中UnitOfWorkManager.Current.SetTenantId()并不是修改AbpSession.TenantId的值

ABP框架中UnitOfWorkManager.Current.SetTenantId()并不是修改AbpSession.TenantId的值

时间:2023-06-16 14:34:57浏览次数:45  
标签:AbpSession SetTenantId tenantId Current UnitOfWorkManager TenantId

1. 结论

UnitOfWorkManager.Current.SetTenantId()修改的是ABP过滤器中使用的TenantId,并不会修改AbpSession.TenantId

代码演示:

image
image

2. 关于UnitOfWorkManager.Current.SetTenantId()方法的作用

  • 前提:ABP框架是是支持多租户的,对于单数据库的多租户设计,需要通过TenantId来区分宿主和租户,并且ABP支持自动过滤租户数据(详情请查阅官方文档)

  • 当执行一个数据库查询(如:_deviceRepository.GetAll();)时,会自动取AbpSession.TenantId添加到查询条件中,而UnitOfWorkManager.Current.SetTenantId(_tenantId)的之后,ABP的过滤器会优先使用_tenantId,但AbpSession.TenantId不会改变

  • 如果在添加/修改的时候,需要用到SetTenantId之后的_tenantId怎么办呢?反正是不能直接用AbpSession.TenantId

    • 两个办法:
      1. 使用UnitOfWorkManager.Current.GetTenantId()获取;
      2. 直接使用_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. 优点

  1. 不需要手动写TenantId查询条件,尤其是涉及到多个查询的时候,优点更为明显
  2. 配合using使用,可以灵活查询不同租户Id的数据

标签:AbpSession,SetTenantId,tenantId,Current,UnitOfWorkManager,TenantId
From: https://www.cnblogs.com/wangxiaorang/p/17485438.html

相关文章

  • 当前本地符号表 current local symbol table
    实践:1、a,b=123,456locals()['a']=1locals()['b']=2 场景:画图:时序图汽车、轮船两家公司分别销量 forvarin['car','ship']:#默认橙色plot_data=data.dropna(subset=[var],inplace=False)locals()['line{}a'.format......
  • if [ "$1""xx" != "xx" ];then current_path=$1 fi汉语
     if["$1""xx"!="xx"];thencurrent_path=$1fi这段sh脚本代码是用来检查当前工作目录的。它的作用是,如果用户传递了一个参数(比如"xx"),而且该参数与当前工作目录不同,则将当前工作目录设置为传递的参数(即"xx")。具体来说,代码中的"if"语句判断参数$1是否等......
  • JDK 1.6 与 1.8 中的 ConcurrentHashMap 学习
    ConcurrentHashMap使用segment(继承ReentrantLock)和volatile来保证线程安全性segment的数量为16,每个segment中桶(HashEntry[])的数量可以增加,桶中放的是由HashEntry组成的链表;count表示segment中元素的数量,modCount统计导致结构变化操作的次数(put、remove、replace......
  • Apr 2021-Lucid Dreaming for Experience Replay: Refreshing Past States with the
    摘要:经验回放(ER)通过允许智能体在回放缓冲区中存储和重用其过去的经验,提高了离线强化学习(RL)算法的数据效率。虽然已经提出了许多技术,以通过偏差如何从缓冲区中采样来增强ER,但迄今为止,它们还没有考虑在缓冲区内刷新经验的策略。本文提出了用于经验回放的清醒梦(LiDER),一个概念上......
  • 项目访问的端口是8018,但是真实接口地址是19080,导致访问这个地址http://9.6.237.104:80
    这个问题是由于您的前端页面与后端应用程序的接口地址不在同一个域名下所引起的跨域请求。在浏览器中,出于安全考虑,通常不允许JavaScript从一个域名下访问另一个不同域名下的资源,这种行为被称为跨域请求(Cross-OriginResourceSharing,CORS)。有一些方法可以解决跨域问题,下面是......
  • 为什么HashMap可以存null,而ConcurrentHashMap不可以?
    HashMap中,null可以作为键也可以做为值。而在ConcurrentHashMap中,Key和Value都不允许为null。ConcurrentMap(如ConcurrentHashMap、ConcurrentSkipListMap)不允许使用null值的主要原因是,在非并发的Map中(如HashMap),是可以容忍模糊性(二义性)的,而在并发Map中是无法容忍的。假如说,所有的......
  • An attempt has been made to start a new process before the current process has f
     Traceback(mostrecentcalllast): File"<string>",line1,in<module> File"E:\Eprogramfiles\Anaconda3\lib\multiprocessing\spawn.py",line116,inspawn_main   exitcode=_main(fd,parent_sentinel) File"E......
  • ConcurrentHashMap
    引言HashMap在我们日常的开发中使用频率最高的一个工具类之一,然而使用HashMap最大的问题之一就是它是线程不安全的,如果我们想要线程安全,这时候就可以选择使用ConcurrentHashMap,ConcurrentHashMap和HashMap的功能是基本一样的,ConcurrentHashMap是HashMap的线程安全版......
  • AopContext.currentProxy();
    获取代理对象的方法:AopContext.currentProxy();在同一个类中,非事务方法A()调用事务方法B(),事务失效,得采用((xxxObj)AopContext.currentProxy()).B()来进行调用,事务才能生效。B方法被A调用,对B方法的切入失效,但加上AopContext.currentProxy()创建了代理类,在代理类中调用该方......
  • Java并发编程之ConcurrentLinkedQueue详解
    简介在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循......