EF 5, Code d’abord – Créez une nouvelle firebase database et exécutez toutes les migrations par programme

J’utilise les migrations Entity Framework Code First et je souhaite exécuter une suite de tests d’intégration. Chaque fois que les tests sont exécutés, je souhaite recréer la firebase database et appliquer toutes les migrations.

Les étapes devraient être:

  1. Supprimer la firebase database de test existante (le cas échéant)
  2. Créer une nouvelle firebase database de test et appliquer toutes les migrations
  3. Données de semences

Il s’agit d’un projet existant auquel j’ai ajouté des migrations et j’ai utilisé la commande Enable-Migrations pour créer une migration “InitialCreate” contenant du code pour append toutes les tables à ma firebase database.

Le code dans mon IDatabaseInitializer personnalisé est le suivant:

 public void InitializeDatabase(MyContext context) { //delete any existing database, and re-create context.Database.Delete(); context.Database.Create(); //apply all migrations var dbMigrator = new DbMigrator(new Configuration()); dbMigrator.Update(); //seed with data this.Seed(context); context.SaveChanges(); } 

La méthode Up de ma migration InitialCreate n’est pas appelée par ce code, ce qui n’est pas ce à quoi je m’attendais. Au lieu de cela, toutes les tables sont créées lorsque la méthode Database.Create() est appelée. J’ai besoin de la migration InitialCreate pour s’exécuter car j’ai du code supplémentaire pour créer des procédures stockées.

Ma question est donc la suivante: comment créer par programme une nouvelle firebase database et exécuter toutes les migrations (y compris la migration InitialCreate)?

Le code suivant m’a permis de répondre aux besoins du scénario de test d’intégration décrit dans la question, mais existe-t-il un meilleur moyen?

 public void InitializeDatabase(MyContext context) { //delete any existing database, and re-create context.Database.Delete(); var newDbConnSsortingng = context.Database.Connection.ConnectionSsortingng; var connSsortingngBuilder = new SqlConnectionSsortingngBuilder(newDbConnSsortingng); var newDbName = connSsortingngBuilder.InitialCatalog; connSsortingngBuilder.InitialCatalog = "master"; //create the new DB using(var sqlConn = new SqlConnection(connSsortingngBuilder.ToSsortingng())) { using (var createDbCmd = sqlConn.CreateCommand()) { createDbCmd.CommandText = "CREATE DATABASE " + newDbName; sqlConn.Open(); createDbCmd.ExecuteNonQuery(); } } //wait up to 30s for the new DB to be fully created //this takes about 4s on my desktop var attempts = 0; var dbOnline = false; while (attempts < 30 && !dbOnline) { if (IsDatabaseOnline(newDbConnString)) { dbOnline = true; } else { attempts++; Thread.Sleep(1000); } } if (!dbOnline) throw new ApplicationException(string.Format("Waited too long for the newly created database \"{0}\" to come online", newDbName)); //apply all migrations var dbMigrator = new DbMigrator(new Configuration()); dbMigrator.Update(); //seed with data this.Seed(context); context.SaveChanges(); } private bool IsDatabaseOnline(string connString) { try { using (var sqlConn = new SqlConnection(connString)) { sqlConn.Open(); return sqlConn.State == ConnectionState.Open; } } catch (SqlException) { return false; } } 

Supprimez simplement l’étape “Créer une firebase database” et utilisez les migrations par vous-même. Je mets un exemple de projet sur GitHub , mais le plus important est

 Configuration config = new Configuration(); DbMigrator migrator = new DbMigrator(config); foreach (ssortingng s in migrator.GetPendingMigrations()) { migrator.Update(s); }