gpt4 book ai didi

c# - EF Core HasQueryFilter 仅适用于过滤器表达式中的第一个值

转载 作者:太空宇宙 更新时间:2023-11-03 12:06:14 26 4
gpt4 key购买 nike

我正在使用 EF Core HasQueryFilter 扩展方法,它位于 OnModelCreating 方法中。

我正在使用服务将用户 ID 注入(inject) DbContext,然后将 userId 应用于查询过滤器。第一次执行 OnModelCreating 时,它按预期正常工作。但是当我更改用户并将不同的 userId 传递给 DbContext 时,查询过滤器不会受到明显的影响,因为这次没有调用 OnModelCreating。

该应用程序的一些背景知识:它是一个核心 2.2 API 项目,使用 JWT token 对用户进行身份验证。我填充用户声明并使用 JWT 初始化注入(inject)的身份验证服务,因此对于 API 的每次调用,userId 都可以不同,因此查询过滤器应该适用于不同的 userIds。

示例代码如下:

public class SqlContext : DbContext
{
private readonly IAuthService _authService;

public SqlContext(DbContextOptions options, IAuthService authService) : base(options)
{
_authService = authService;
}

public DbSet<Device> Devices { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

modelBuilder.Entity<Device>().HasQueryFilter(p => !p.IsDeleted && p.ManufacturerId == _authService.ManufacturerId);
}
}

DbContext 是如何初始化的。

 services.AddDbContextPool<TContext>(o =>
o.UseSqlServer(configuration["Settings:SqlServer:DefaultConnection"],
b =>
{
b.MigrationsAssembly(configuration["Settings:SqlServer:MigrationAssembly"]);
b.CommandTimeout(60);
b.EnableRetryOnFailure(2);
})
.ConfigureWarnings(warnings =>
{
warnings.Throw(RelationalEventId.QueryClientEvaluationWarning);
}))
.AddTransient<TContext>();

最佳答案

终于解决了。

因为过滤器正在工作,但在第一次请求后创建模型后它就没有得到更新。原因是 EF 正在缓存创建的模型。因此,我必须实现 IModelCacheKeyFactory 以便根据过滤器捕获不同的模型。

internal class DynamicModelCacheKeyFactory : IModelCacheKeyFactory
{
public object Create(DbContext context)
{
if (context is SqlContext dynamicContext)
{
return (context.GetType(), dynamicContext._roleCategory);
}
return context.GetType();
}
}

并像这样将其附加到上下文。

protected override void OnConfiguring(DbContextOptionsBuilder builder)
{
base.OnConfiguring(builder);

builder.ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();
}

关于c# - EF Core HasQueryFilter 仅适用于过滤器表达式中的第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54832620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com