0

ABP 为实现 IMultiTenant 接口的实体添加了一个额外的租户过滤器。因此,当我们使用标准存储库时,将应用过滤器:

public class OrderService : ApplicationService, IOrderService, ITransientDependency
{
    public IReadOnlyRepository<Order, Guid> _repository { get; set; }

    public async Task<OrderDto> GetAsync(Guid id)
    {
        Order order = await _repository.FindAsync(id); //Is it possible to search among all tenants?
        return ObjectMapper.Map<Order, OrderDto>(order);
    }
}

查看它产生的查询,看起来必须有一种方法可以避免这个过滤器,可能是通过一个额外的参数或者像这样的smth。

SELECT TOP(2) *
FROM [AbpOrders] AS [a]
WHERE (@__ef_filter__p_0 = CAST(1 AS bit) OR [a].[TenantId] IS NULL) AND ([a].Id = @__Id_0)

如果我们以某种方式传递 '@__ef_filter__p_0' 参数,那么它将在所有租户中搜索。任何帮助表示赞赏。

4

1 回答 1

1

这就是你这样做的方式 https://docs.abp.io/en/abp/latest/Data-Filtering#idatafilter-service-enable-disable-data-filters

public class OrderService : ApplicationService, IOrderService, ITransientDependency
{
    public IDataFilter DataFilter { get; set; }
    public IReadOnlyRepository<Order, Guid> Repository { get; set; }

    public async Task<OrderDto> GetAsync(Guid id)
    {
        //Temporary disable the IMultiTenant filter
        using (DataFilter.Disable<Volo.Abp.MultiTenancy.IMultiTenant>())
        {
            Order order = await Repository.FindAsync(id);
            return ObjectMapper.Map<Order, OrderDto>(order);
        }
    }
}
于 2020-05-23T11:36:13.370 回答