Я использую метод расширения EF Core HasQueryFilter, который находится внутри метода OnModelCreating.
Я внедряю идентификатор пользователя в DbContext с помощью службы, а затем применяю userId к фильтру запросов.Впервые при выполнении OnModelCreating он работает нормально, как и ожидалось.Но когда я меняю пользователя и передаю другой идентификатор пользователя в DbContext, фильтр запросов не проявляет такой очевидности, поскольку OnModelCreating на этот раз не вызывается.
Небольшой фон приложения: это основной API-проект 2.2.который аутентифицирует пользователей, используя токен JWT.Я заполняю заявки пользователей и инициализирую внедренную службу аутентификации, используя JWT, поэтому для каждого вызова 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>();