/// <summary> /// Assign Query Filters base and other set on <see cref="IEntityTypeConfiguration{TEntity}">map</see> /// </summary> /// <param name="builder"></param> protected virtual void AssignTenantAndOtherQueryFilterOnModelCreating([NotNull] ModelBuilder builder) { foreach (var relationship in builder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys())) { relationship.DeleteBehavior = DeleteBehavior.Restrict; } var allTypes = ScanAssemblyTypes(); var tt = GetAllEntityTypes(allTypes); foreach (Type entityType in tt) { var entityName = entityType.Name; var entityFullName = entityType.FullName ?? entityName; try { #region QueryFilters var paramName = $"{entityName}_p"; var entityTypeFromModel = builder.Model.FindEntityType(entityFullName); var queryFilter = entityTypeFromModel.GetQueryFilter(); var queryParam = queryFilter?.Parameters.FirstOrDefault(); if (null != queryParam) { paramName = queryParam.Name; } ParameterExpression paramExpr = Expression.Parameter(entityType, paramName); Expression bodyDeleted = Expression.Equal(Expression.Property(paramExpr, "Deleted"), Expression.Constant(false) ); Expression body = null; if (null != queryFilter) { var res = Expression.Lambda(Expression.Invoke(queryFilter, paramExpr), paramExpr); body = Expression.AndAlso(bodyDeleted, res.Body); } else { body = bodyDeleted; } var name = $"TenantQueryFilter_{entityName}"; LambdaExpression lambdaExpr = Expression.Lambda(body, name, new List <ParameterExpression>() { paramExpr } ); var entyTYpeBuilder = builder.Entity(entityType); entyTYpeBuilder.HasQueryFilter(lambdaExpr); #endregion } catch (Exception e) { var err = $"Error configuring '{entityName}'"; ContextLogger?.LogCritical(err, e); throw new Exception(err, e); } } }