2016-04-18 15 views
0

Ich schreibe eine Web-API, die an eine Datenbank angehängt ist, die ich mit Model First erstellt habe.Deaktivieren von Migrationen

Als neu war ich verwirrte Modell zuerst mit Code zuerst.

Da es sich um meine erste EF/Web App handelt, habe ich nicht realisiert, dass die Migration von Model First noch nicht implementiert wurde und ich habe das Verfahren zur Implementierung verfolgt. Als es lief, habe ich ein paar Fehler bekommen, habe nachgesehen und erst dann bemerkt, dass ich es wieder entfernen muss.

Den Anweisungen von jemandem folgend löschte ich den Migrationsordner und die Tabelle _migrationHistory aus der Datenbank.

Aber jetzt bekomme ich die folgende Ausnahme, wenn die Tabelle _migrationhistory in der Datenbank fehlt.

protected void Application_Start() 
{ 
    // Call initializer 
    Database.SetInitializer(new PulseDbInitializer()); 
    new ApplicationDbContext().Database.Initialize(true); <- error here 

    AreaRegistration.RegisterAllAreas(); 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

„Eine Ausnahme vom Typ‚System.NotSupportedException‘aufgetreten in EntityFramework.dll wurde aber in Benutzercode Zusätzliche Informationen nicht behandelt. Modell Kompatibilität nicht überprüft werden kann, da die Datenbank nicht Modell Metadaten enthält Modell Kompatibilität kann nur für Datenbanken überprüft werden, die mit Code First oder Code First Migrations erstellt wurden. "

Das folgende ist eine teilweise Beschreibung meiner initializer

public partial class PulseDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>, IPulseDbInit 
//public partial class PulseDbInitializer :DropCreateDatabaseAlways<ApplicationDbContext>, IPulseDbInit 
{ 
    private ApplicationDbContext _context; 
    protected override void Seed(ApplicationDbContext context) 
    { 
    _context = context; 
    var pid = new PulseDbInitializionData(context); 
    pid.Init(this); 
    } 
}// class PulseDbInitializer 

Es scheint, dass die App-Migrationen zu verwenden versucht, (weil es die _migrationhistory Tabelle erstellen), obwohl ich den Migrationen Unterordner entfernt haben. Da ich neu hier bin, bin ich mir nicht sicher, wohin ich gehen soll. Mir ist bewusst, dass ich meinen Initialisierer erstellt habe, siehe oben, also fehlt mir etwas?

EDIT - zu lang für einen Kommentar

Im nicht sicher, dass wir sie sind zu verstehen.

Ganz einfach, ich weiß nicht, was die Tabelle _MigrationHistory in meiner Datenbank als afaik generiert, wenn ich das Unterverzeichnis Migration aus meinem Projekt lösche und die Datenbank lösche, dann dachte ich, das ist alles, was ich tun muss, um Migrationen fallen zu lassen.

In meinem Modell ist das DropCreateDatabaseIfModelChanges das, was ich immer zum Generieren der Datenbank verwendet habe und funktioniert wie erwartet. Es erstellt eine neue Datenbank oder wird neu erstellt, wenn sich das Modell ändert.

Bis ich die Migration hinzugefügt habe, habe ich diese _MigrationHistory-Tabelle nicht bemerkt und ich habe keine Ahnung, ob der Befehl add-migration meinem Projekt Code hinzugefügt hat, den ich löschen oder ändern muss (ich hasse Dinge wirklich und nicht genau gesagt, was in einer Art von Protokoll getan wurde. Bitte Microsoft, für zukünftige Referenz)

Oder bin ich total falsch und die _MigrationHistory Tabelle war immer da, aber ich habe nie bemerkt? Es scheint alles zu funktionieren, solange ich den Tisch nicht entferne.

+0

Die DropCreateDatabaseAlways, die Sie kommentiert haben herausarbeiten sollte. http://StackOverflow.com/questions/29349443/why-model-compatibility-cannot-be-checked –

+0

@SteveGreene ja, aber das würde fallen lassen und die Datenbank bei jeder Initialisierung neu erstellen, nicht wahr? – Jcl

+0

Ja, führe es einmal aus und wechsle dann zurück zu DropCreateDatabaseIfModelChanges –

Antwort

0

Ihr Initialisierer erbt von DropCreateDatabaseIfModelChanges, der nach Modelländerungen sucht. Da Sie nicht zuerst Code verwenden, können Sie nicht nach Modelländerungen im Code suchen (da Ihr Code das Modell nicht definiert - das wäre Code-first -... das Modell definiert den Code - das ist das Modell - zuerst-) ...so müssen Sie Ihre eigene IDatabaseInitializer, die nur überprüft (zum Beispiel) implementieren, dass die Datenbank vorhanden ist:

public partial class PulseDbInitializer : IDatabaseInitializer<ApplicationDbContext>, IPulseDbInit 
{ 
    public void InitializeDatabase(ApplicationDbContext context) 
    { 
    var exists = new DatabaseTableChecker().AnyModelTableExists(context.InternalContext); 
    if (exists == DatabaseExistenceState.Exists) 
    { 
     // maybe check if certain data exists and call the `Seed` method if 
     // it doesn't 
     return; 
    } 

    // Throw some error if it doesn't exist 
    } 

    protected override void Seed(ApplicationDbContext context) 
    { 
    _context = context; 
    var pid = new PulseDbInitializionData(context); 
    pid.Init(this); 
    } 
}