Я использую метод расширения EF Core HasQueryFilter, который находится внутри метода OnModelCreating.
Я ввожу идентификатор пользователя в DbContext с помощью службы, а затем применяю идентификатор пользователя к фильтру запроса. В первый раз, когда OnModelCreating выполняется, он работает нормально, как и ожидалось. Но когда я меняю пользователя и передаю другой идентификатор пользователя в DbContext, фильтр запроса не затрагивается так очевидно, потому что на этот раз OnModelCreating не вызывается.
Немного предыстории приложения: это основной проект API 2.2, который аутентифицирует пользователей с помощью токена JWT. Я заполняю утверждения пользователя и инициализирую введенную службу аутентификации с помощью JWT, поэтому для каждого вызова API идентификатор пользователя может быть другим, поэтому фильтр запроса должен работать с разными идентификаторами пользователя.
Примеры кодов ниже:
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>();
OnModelCreating
вызывается, как только контекст БД будет правильно создан (new
-ed). Сценарий поддерживается, но требует специальной настройки выражения фильтра. - person Ivan Stoev   schedule 22.02.2019services.AddDbContextPool
наservices.AddDbContext
. - person Ivan Stoev   schedule 24.02.2019