Как настроить глобальные фильтры запросов в подходе базы данных? - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь использовать глобальные фильтры запросов для реализации многопользовательского режима в веб-приложении ASP.NET Core.На данный момент у меня есть отдельная база данных для каждого арендатора, и я настраиваю контекст в файле startup.cs следующим образом:

services.AddDbContext<dbcontext>((service, options) =>
                options.UseSqlServer(Configuration[$"Tenant:{service.GetService<ITenantProvider>().Current}:Database"])
                    .ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning)),
            contextLifetime: ServiceLifetime.Scoped, optionsLifetime: ServiceLifetime.Scoped);

Это отлично работает.Теперь заказчику больше не нужна отдельная база данных для каждого арендатора, поэтому я добавил столбец teanntId к каждой таблице и хочу использовать глобальные фильтры запросов для реализации этого.


Как описано в документации , я могу добавить фильтр запросов в методе OnModelCreating:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>().Property<string>("TenantId").HasField("
    modelBuilder.Entity<Blog>().HasQueryFilter(b => EF.Property<string>(b, "TenantId") == _tenantId);
}

Но сначала я использую базу данныхподход, поэтому каждый раз, когда я генерирую модель, я теряю эту конфигурацию. Есть ли другой способ настройки глобального фильтра запросов, например, использование DbContextOptionsBuilder?

Я использую EF Core 2.1.2.

1 Ответ

0 голосов
/ 14 февраля 2019

Я закончил тем, что использовал частичный класс, который переопределяет метод OnModelCreating:

public partial class MyContext : DbContext
{
    public MyContext(DbContextOptions<MyContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        OnModelCreatingInternal(modelBuilder);
        modelBuilder.Entity<Blog>().Property<string>("TenantId").HasField("
        modelBuilder.Entity<Blog>().HasQueryFilter(b => EF.Property<string>(b, "TenantId") == _tenantId);
    }
}

Мне все еще нужно изменить сгенерированный код (изменить сгенерированный сигнатур OnModelCreating на OnModelCreatingInternal и удалить переопределение).Но при аренде я получаю ошибку компилятора, поэтому не могу ее забыть.

...