Entity framework 实体框架核心全局动态查询过滤器
我们正在使用ef core 3.1 我们想使用动态查询过滤器, 我尝试了示例实现,但并没有按照预期正常工作,总是过滤相同的租户id,我试图在下面解释Entity framework 实体框架核心全局动态查询过滤器,entity-framework,entity-framework-core,ef-core-3.1,Entity Framework,Entity Framework Core,Ef Core 3.1,我们正在使用ef core 3.1 我们想使用动态查询过滤器, 我尝试了示例实现,但并没有按照预期正常工作,总是过滤相同的租户id,我试图在下面解释 公共类TestDbContext:DbContext { 公共数据库集租户{get;set;} 私有只读ITenantProvider\u租户Provider; 私有Guid?TenantId=>\u tenantProvider.TenantId; publictestdbcontext(DbContextOptions选项,ITenantPr
公共类TestDbContext:DbContext
{
公共数据库集租户{get;set;}
私有只读ITenantProvider\u租户Provider;
私有Guid?TenantId=>\u tenantProvider.TenantId;
publictestdbcontext(DbContextOptions选项,ITenantProvider租户提供者):基本(选项)
{
_租户提供者=租户提供者;
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.haskqueryfilter(p=>EF.Property(p,“TenantId”)==TenantId);
}
}
ITenantProvider从HttpContext头返回TenantId
此代码从第一个请求中筛选始终相同的租户id
更新:
public class TenantProvider : ITenantProvider
{
private readonly IHttpContextAccessor _httpContextAccessor;
public TenantProvider(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public Guid? TenantId
{
get
{
if (_httpContextAccessor.HttpContext.Request.Headers.TryGetValue(HeaderNames.TenantId, out var tenantId) &&
Guid.TryParse(tenantId, out Guid parsedTenantId))
{
return parsedTenantId;
}
return null;
}
}
}
比如说
第一次请求租户=60000000-0000-0000-0000-000000000000
此筛选器=>60000000-0000-0000-0000-000000000000
第二次请求租户=10000000-0000-0000-0000-000000000000
此筛选器=>60000000-0000-0000-0000-000000000000
但不起作用
不是问题描述。而且此代码从第一个请求中筛选始终相同的租户id
听起来好像过滤器确实起作用了。每次都返回相同ID的是\u tenantProvider.TenantId
。或者每次都使用相同的DbContext(非常糟糕的主意),这意味着您总是使用TenantId
字段中存储的值发布ITenantProvider
代码。这似乎与EF无关Core@PanagiotisKanavos补充说明正确。将TenantId
的可见性更改为public
不会有帮助?但是您是否使用了不同的DbContext实例?还是单身/合用的?