【问题标题】:Add default value for one entity for tenants from host in AspNetBoilerPlate为 AspNetBoilerPlate 中主机的租户添加一个实体的默认值
【发布时间】:2021-09-27 06:42:40
【问题描述】:

场景:
我的多租户项目基于 ASPNetBoilerPlate。
我有一个“WORK”实体,它是 IMayHaveTenant。每个租户都必须看到 HOST 中的默认作品以及他的作品。我必须怎么做?
我需要一些代码,例如:tenantId == id || tenantId is null

错误答案

using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant)){    }

这也会返回其他租户的作品。

【问题讨论】:

    标签: multi-tenant aspnetboilerplate


    【解决方案1】:

    创建一个接口,如果您想要其他内置功能,则继承 IMayHaveTenant

    public interface IMayHaveTenantSharedWithHost : IMayHaveTenant
    {
    }
    

    实现该接口:

    public class Work : Entity, IMayHaveTenantSharedWithHost
    {
        public int? TenantId { get; set; }
    
        // ...
    }
    

    在您的 AbpDbContext 子类中覆盖 CreateFilterExpression 并处理该接口:

    protected override Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>()
        where TEntity : class
    {
        Expression<Func<TEntity, bool>> expression = null;
    
        if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
        {
            Expression<Func<TEntity, bool>> softDeleteFilter = e => !IsSoftDeleteFilterEnabled || !((ISoftDelete) e).IsDeleted;
            expression = expression == null ? softDeleteFilter : CombineExpressions(expression, softDeleteFilter);
        }
        
        // if (typeof(IMayHaveTenant).IsAssignableFrom(typeof(TEntity)))
        if (typeof(IMayHaveTenantSharedWithHost).IsAssignableFrom(typeof(TEntity)))
        {
            Expression<Func<TEntity, bool>> mayHaveTenantFilter = e => !IsMayHaveTenantFilterEnabled || ((IMayHaveTenant)e).TenantId == CurrentTenantId || ((IMayHaveTenant)e).TenantId == null;
            expression = expression == null ? mayHaveTenantFilter : CombineExpressions(expression, mayHaveTenantFilter);
        }
        else if (typeof(IMayHaveTenant).IsAssignableFrom(typeof(TEntity)))
        {
            Expression<Func<TEntity, bool>> mayHaveTenantFilter = e => !IsMayHaveTenantFilterEnabled || ((IMayHaveTenant)e).TenantId == CurrentTenantId;
            expression = expression == null ? mayHaveTenantFilter : CombineExpressions(expression, mayHaveTenantFilter);
        }
    
        if (typeof(IMustHaveTenant).IsAssignableFrom(typeof(TEntity)))
        {
            Expression<Func<TEntity, bool>> mustHaveTenantFilter = e => !IsMustHaveTenantFilterEnabled || ((IMustHaveTenant)e).TenantId == CurrentTenantId;
            expression = expression == null ? mustHaveTenantFilter : CombineExpressions(expression, mustHaveTenantFilter);
        }
    
        return expression;
    }
    

    【讨论】:

    • 太棒了......这行得通!
    猜你喜欢
    • 1970-01-01
    • 2019-01-06
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多