2013-01-09 14 views
12

Ich habe ein Problem beim Abrufen der Seed-Methode auf meinem benutzerdefinierten Datenbank-Initialisierer aufgerufen werden. Ich verwende EF 5.0 und habe den folgenden Code:DropCreateDatabaseAlways Seed nicht aufgerufen

public static class MyDatabase 
{ 
    public static void Initialize() 
    { 
     Database.SetInitializer(new MyInitializer()); 
    } 
} 

public class MyInitializer : DropCreateDatabaseAlways<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
     base.Seed(context); 
     context.Roles.Add(new Role 
     { 
      ID = 1, 
      Name = "User", 
     }); 
     context.Roles.Add(new Role 
     { 
      ID = 2, 
      Name = "Admin", 
     }); 
     context.SaveChanges(); 
    } 
} 

Diese beiden Klassen von der MVC-Anwendung in einer separaten Klassenbibliothek vorhanden sind. Im Global.asax, nenne ich die Initialize() Methode:

MyDatabase.Initialize(); 

Die Datenbank gerade fein erstellt wird, es ist nur die Seed(MyContext context) Methoden nicht aufgerufen werden und keine Daten werden in der Datenbank setzen.

+0

Aus Neugier, was passiert, wenn Sie base.Seed am Ende der Methode setzen? – IronMan84

+0

Selbe Sache, es heißt nicht. Ich setze einen Haltepunkt auf den Kontext.Roles.Add und es bricht nie. Würde es etwas damit zu tun haben, dass sich der Initialisierer in einer anderen Klassenbibliothek befindet und nicht im Webprojekt selbst? Ich dachte, ich hätte es schon einmal so gemacht, kann mich aber nicht mehr genau erinnern. –

+0

Es könnte. Es könnte auch sein, dass Sie alles in eine statische Klasse gestellt haben. – IronMan84

Antwort

1

Die Methode Seed wird aufgerufen, sobald Sie die erste SQL-Abfrage an Ihre Datenbank senden, nicht an Ihre Application_Start. Zum Beispiel:

using (var ctx = new MyContext()) 
{ 
    var rolesCount = ctx.Roles.Count(); // should return 2 
} 
+0

Ich sende Anfragen an die Datenbank. Dies kann ich mit Intellitrace bestätigen. Im Layout bevölke ich ein Dropdown mit einer Liste von Daten, die immer leer sind. Ich versuche auch, einen Benutzer in einer Rolle zu speichern, die nicht vorhanden ist. –

13

Ihre Datenbank wird später erstellt werden, wenn Sie Ihren Kontext verwenden oder Sie könnten es immer mit Ihrem Kontext wie in der Application_Start() -Methode in Global.asax.cs erstellen erzwingen:

System.Data.Entity.Database.SetInitializer(new MyInitializer()); 
MyContext db = new MyContext(); 
db.Database.Initialize(true); 
+0

Ich hatte noch keine Gelegenheit das auszuprobieren, aber wenn ich das tue, werde ich dich wissen lassen, wie es läuft. Danke für den Vorschlag! –