2012-06-25 5 views
6

Я создал два DbContexts, один для конфигурации приложения, второй для ведения журнала.Несколько DbContext, несколько Database.SetInitializer

Причина в том, что я хочу установить максимальный размер в db журнала, чтобы он не использовал все свободное место на диске и не работал с другими базами данных.

В моем файле Global.asax.cs, у меня есть следующие:

 protected void Application_Start() 
    { 

     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     Database.SetInitializer<AdminContext>(new AdminInitialiser()); 
     Database.SetInitializer<LoggingContext>(new LoggingInitialiser()); 
    } 

Метод InitializeDatabase в LoggingInitialiser не вызывается. Это потому, что можно установить только один инициализатор? Есть ли способ инициализации для двух DbContexts?

ответ

8

Вместо этого установите инициализатор в конструкторе DbContext.

public class AdminContext : DbContext 
{ 
    public AdminContext() 
    { 
     Database.SetInitializer(new AdminInitialiser()); 
    } 
} 

public class LoggingContext : DbContext 
{ 
    public LoggingContext() 
    { 
     Database.SetInitializer(new LoggingInitialiser()); 
    } 
} 
+3

Не существует ли риск, что это будет вызвано несколько раз? Я подозреваю, что инициализация дорогостоящая, даже если нет изменений в развертывании. Как насчет того, если вы поместите его в статический конструктор, то есть он когда-нибудь будет вызван один раз? – Holf

3

Да, вы можете это сделать. Вам просто нужно инициализировать, прежде чем переходить к следующему.

Database.SetInitializer<MyDBContext>(myInitializer); 
    MyDbContext context = new MyDbContext(); 
    context.Database.Initialize(false); 

    Database.SetInitializer<MySecondDBContext>(myInitializer); 
    MySecondDbContext context2 = new MySecondDbContext(); 
    context2.Database.Initialize(false); 

Примечание: что я обычно получаю экземпляр DbContext из распознавателя зависимостей ...

3

Я предлагаю поставить вызов SetInitializer статического конструктора, как показано ниже:

static ApplicationIdentityDbContext() 
    { 
     Database.SetInitializer(new IdentityDbInitializer()); 
    } 

Ниже от MSDN

Статический конструктор используется для инициализации любых статических данных или для выполнения конкретного действия, которое необходимо s выполняется только один раз. Он вызывается автоматически до создания первого экземпляра или ссылки на любые статические члены.

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

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