AspNetBoilerPlate多租户项目如何让租户同时查看宿主默认WORK实体及自有实体
ABP 多租户实体同时查询当前租户和宿主数据实现方案
需求场景
基于ASP.NET Boilerplate框架开发多租户项目时,实现了IMayHaveTenant接口的WORK实体需要支持所有租户同时查询到宿主侧的默认WORK实体和当前租户自行创建的WORK实体,过滤逻辑为tenantId == 当前租户ID || tenantId is null,直接禁用默认MayHaveTenant过滤器的方案会返回其他租户数据,无法满足要求。
推荐实现方案
方案1:自定义WORK实体全局查询过滤器(全局生效,推荐)
直接在你的DbContext中重写WORK实体的全局查询逻辑,覆盖ABP默认的IMayHaveTenant过滤规则,一次配置全项目生效:
- 打开项目对应的DbContext类,找到
OnModelCreating方法,添加如下配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 针对WORK实体单独配置过滤规则 modelBuilder.Entity<WORK>().HasQueryFilter(work => // 匹配当前租户数据 或者 宿主侧无租户ID的公共数据 EF.Property<int?>(work, nameof(IMayHaveTenant.TenantId)) == AbpSession.TenantId || EF.Property<int?>(work, nameof(IMayHaveTenant.TenantId)) == null ); }
- 配置完成后,所有针对WORK实体的LINQ查询都会自动拼接上述过滤条件,不需要额外手动处理,也不会返回其他租户的数据。
方案2:仓储层扩展方法(灵活控制生效范围)
如果你只需要部分查询场景走该逻辑,不需要全局生效,可以封装统一的查询扩展方法:
- 定义WORK仓储的扩展方法:
public static class WorkRepositoryExtensions { public static IQueryable<WORK> GetAllWithHostData(this IRepository<WORK, int> workRepository) { var currentTenantId = workRepository.AbpSession.TenantId; return workRepository.GetAll() .Where(w => w.TenantId == currentTenantId || w.TenantId == null); } }
- 业务代码中需要查询包含宿主数据的WORK列表时,直接调用该扩展方法即可:
var workList = await _workRepository.GetAllWithHostData().ToListAsync();
原错误方案问题说明
直接使用CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant)会完全关闭租户过滤逻辑,查询会返回所有租户的WORK实体数据,不符合业务需求,不推荐使用。
内容的提问来源于stack exchange,提问作者Bsflasher
相关产品推荐
相关产品推荐

