Il s'agit d'un (ré)initialisateur de base de données vraiment agressif pour EF code-first avec des migrations ; utilisez-le à vos risques et périls, mais il semble fonctionner de manière assez répétée pour moi. Il le fera ;
- Déconnexion forcée de tous les autres clients de la base de données.
- Supprimez la BD.
- Reconstruction de la base de données avec les migrations et exécution de la méthode Seed.
- Prenez votre temps ! (surveillez le délai d'attente de votre cadre de test ; un délai d'attente par défaut de 60 secondes peut ne pas être suffisant).
Voici la classe ;
public class DropCreateAndMigrateDatabaseInitializer<TContext, TMigrationsConfiguration>: IDatabaseInitializer<TContext>
where TContext: DbContext
where TMigrationsConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration<TContext>, new()
{
public void InitializeDatabase(TContext context)
{
if (context.Database.Exists())
{
// set the database to SINGLE_USER so it can be dropped
context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, "ALTER DATABASE [" + context.Database.Connection.Database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
// drop the database
context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, "USE master DROP DATABASE [" + context.Database.Connection.Database + "]");
}
var migrator = new MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>();
migrator.InitializeDatabase(context);
}
}
Utilisez-le comme ça ;
public static void ResetDb()
{
// rebuild the database
Console.WriteLine("Rebuilding the test database");
var initializer = new DropCreateAndMigrateDatabaseInitializer<MyContext, MyEfProject.Migrations.Configuration>();
Database.SetInitializer<MyContext>initializer);
using (var ctx = new MyContext())
{
ctx.Database.Initialize(force: true);
}
}
J'utilise également l'astuce "Pooling=false" de Ladislav Mrnka, mais je ne sais pas si elle est nécessaire ou s'il s'agit simplement d'une mesure de sécurité. Cela contribuera certainement à ralentir davantage le test.
0 votes
Le CTP5 est mort. La version actuelle est EF 4.1.