2012-06-25 27 views
6

He creado dos DbContexts, uno es para la configuración de la aplicación, el segundo es para el registro.Multiple DbContext, multiple Database.SetInitializer

La razón es que quiero establecer un tamaño máximo en el archivo de registro db para que no ocupe todo el espacio libre en disco y evite que otras bases de datos funcionen.

En mi archivo global.asax.cs, tengo los siguientes:

 protected void Application_Start() 
    { 

     AreaRegistration.RegisterAllAreas(); 

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

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

El método InitializeDatabase en LoggingInitialiser no se está llamando. ¿Esto es porque solo se puede configurar un inicializador? ¿Hay alguna forma de tener inicializadores para dos DbContexts?

Respuesta

8

Configure el inicializador en el constructor DbContext en su lugar.

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

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

¿No existe el riesgo de que se le llame varias veces? Sospecho que la inicialización es costosa, incluso si no hay cambios para implementar. ¿Qué tal si lo pones en un constructor estático, lo que significa que solo se llamará una vez? – Holf

3

Sí, puedes hacerlo. Solo necesita inicializar antes de pasar al siguiente.

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

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

Nota: que por lo general obtener la instancia DbContext de un solucionador de dependencias ...

3

Sugiero para poner la llamada SetInitializer al constructor estático, como a continuación:

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

abajo es del MSDN

Un constructor estático se utiliza para inicializar cualquier dato estático, o para realizar una acción particular que necesita s para ser realizado una sola vez. Se llama automáticamente antes de que se cree la primera instancia o se hace referencia a cualquier miembro estático.

El constructor estático es ideal para inicializar la base de datos. He usado esta técnica para bases de datos múltiples y me funciona bien.