2012-06-25 15 views
6

Ich habe zwei DbContexte erstellt, einer ist für die Anwendungskonfiguration, der zweite ist für die Protokollierung.Mehrere DbContext, mehrere Database.SetInitializer

Der Grund ist, möchte ich eine maximale Größe auf der Logging-Datenbank festlegen, so dass es nicht alle freien Speicherplatz belegt und andere Datenbanken zu verhindern.

In meiner global.asax.cs Datei, habe ich folgendes:

 protected void Application_Start() 
    { 

     AreaRegistration.RegisterAllAreas(); 

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

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

Die InitializeDatabase Methode in LoggingInitialiser wird nicht aufgerufen werden. Liegt das daran, dass nur ein Initialisierer gesetzt werden kann? Gibt es eine Möglichkeit, Initialisierer für zwei DbContexte zu haben?

Antwort

8

Setzen Sie den Initializer stattdessen im DbContext-Konstruktor.

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

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

Besteht nicht die Gefahr, dass dies mehrfach aufgerufen wird? Ich vermute, dass die Initialisierung teuer ist, selbst wenn keine Änderungen vorgenommen werden. Wie wäre es, wenn Sie es in einen statischen Konstruktor einfügen, was bedeutet, dass es nur einmal aufgerufen wird? – Holf

3

Ja, Sie können es tun. Sie müssen nur initialisieren, bevor Sie mit dem nächsten fortfahren.

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

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

Hinweis: dass ich in der Regel die DbContext Instanz von einem Abhängigkeitsauflöser bekommen ...

3

Ich schlage vor, wie unter den SetInitializer Aufruf an statischen Konstruktor zu setzen:

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

Unten ist aus MSDN

Ein statischer Konstruktor wird verwendet, um statische Daten zu initialisieren oder eine bestimmte Aktion auszuführen, die benötigt wird s nur einmal durchgeführt werden. Es wird automatisch aufgerufen, bevor die erste Instanz erstellt wird oder auf statische Elemente verwiesen wird.

So statische Konstruktor ist ideal für die Initialisierung der Datenbank. Ich habe diese Technik für mehrere Datenbanken verwendet und es funktioniert gut für mich.

Verwandte Themen