2017-01-27 10 views
1

ASP.NET Core OnModelCreating сила огня в каждый запросASP.NET Core OnModelCreating сила пожара в каждом запросе

У меня есть ASP.NET ядра (1.1.0) и базу данных SQL Server. На странице входа у меня есть форма с полем выбора с названием компаний.

Например:

  • Company 1
  • Company 2

Если пользователь выбирает первый "Компания 1", мне нужно переименовать все таблицы с префиксом компании:

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

    foreach (var entity in builder.Model.GetEntityTypes()) 
    { 
     entity.Relational().TableName = "Company 1" + entity.DisplayName(); 
    } 
} 

Работает отлично, но проблемы возникают, когда пользователь выбирает неправильный компаньон y, или выходит из системы и регистрируется в другой компании, OnModelCreating никогда не будет вызван снова, и я не могу перенастроить dbContext.

Можно ли заставить OnModelCreating для каждого запроса?

Или изменить название таблицы после инициализации dbContext?

Спасибо!

+0

Вы можете зарегистрировать 'ActionFilter' в' FilterConfig' –

+0

Можете ли вы показать мне, как это сделать? Я не понимаю, как сила фильтра намодулировать. – nicojmb

ответ

1

Это неправильный путь. OnModelCreating запускается, когда EF создает/описывает модель из ваших классов. Здесь много манипуляции с отражением и типом, включая проверку отношений, по сравнению с реальной БД (и проверка необходимости миграции) и так далее. Вам действительно нужно запускать все эти материалы по каждому запросу ???

Не воссоздавайте DbContext для каждого запроса. Создайте несколько DbContexts и выберите один из них (созданный один раз!) При запуске запроса.

Например:

Сделайте свой главный DbContext аннотацию, и создать столько CompanyXDbContext по мере необходимости. Все они должны наследовать от базового класса, предоставляя ему простой префикс таблицы (в ctor).

Всюду в вашем коде, когда вам нужен DbContext, попросите абстрактный/базовый класс от DI.

В Startup зарегистрируйте свой абстрактный DbContext с заводским методом для выбора реального в зависимости от текущих переменных или параметров или напишите собственное промежуточное программное обеспечение, которое создает правильный экземпляр на основе текущего запроса.


Если у вас есть МНОГО CompanyX, то вам может понадобиться что-то другое вместо многих предварительно кодированных классов CompanyXDbContext, что-то с классом выполнения создающее или может быть дженерики ... Но основная идея остается неизменной - делать не воссоздавайте модель снова и снова по каждому запросу.

 Смежные вопросы

  • Нет связанных вопросов^_^