如何解决使用 IOC 时如何忽略 EF Core 中 DbContext 中的查询过滤器
我使用 EF Core 和 .NET Core 中的内置 IOC。我在 HasQueryFilter
中添加了 OnModelCreating
,但我想根据某个请求忽略该 QueryFilter
,例如,如果我的角色是管理员,我想忽略它,并且我想在所有请求的一种方法。
我可以在哪里以及如何做到这一点?
protected override void OnModelCreating(ModelBuilder builder)
{
// it should be placed here,otherwise it will rewrite the following settings!
base.OnModelCreating(builder);
builder.Model.GetEntityTypes()
.Where(entityType => typeof(ITenant).IsAssignableFrom(entityType.ClrType))
.ToList()
.ForEach(entityType =>
{
builder.Entity(entityType.ClrType)
.HasQueryFilter(ConvertFilterExpression<ITenant>(e => (GetTenantId() == e.TenantId),entityType.ClrType));
});
}
private static LambdaExpression ConvertFilterExpression<Entity>(Expression<Func<Entity,bool>> filterExpression,Type entityType)
{
var newParam = Expression.Parameter(entityType);
var newBody = ReplacingExpressionVisitor.Replace(filterExpression.Parameters.Single(),newParam,filterExpression.Body);
return Expression.Lambda(newBody,newParam);
}
private Guid GetTenantId()
{
var tenantId = new Guid();
var _httpContextAccessor = this.GetService<IHttpContextAccessor>();
if (_httpContextAccessor.HttpContext != null && _httpContextAccessor.HttpContext.User.Claims.Any(x => x.Type == "TenantId"))
{
var tenant = _httpContextAccessor.HttpContext
.User.Claims
.Where(x => x.Type == "TenantId")
.FirstOrDefault().Value;
return Guid.Parse(tenant);
}
return tenant;
}
解决方法
为什么不创建 2 个 DbContext?一个带过滤器,一个不带。
然后在代码中的其他地方,您可以根据 cookie 或令牌或其他任何内容来决定使用 Admin DbContext 或 Filtered DbContext
也许让 Filtered DbContext 继承自 Admin DbContext
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。