«Impossible de supprimer la firebase database car elle est actuellement utilisée». Comment réparer?

Ayant ce code simple, j’obtiens “Impossible de supprimer la firebase database” test_db “car elle est actuellement utilisée (méthode CleanUp) au moment de son exécution.

[TestFixture] public class ClientRepositoryTest { private const ssortingng CONNECTION_STRING = "Data Source=.;Initial Catalog=test_db;Trusted_Connection=True"; private DataContext _dataCntx; [SetUp] public void Init() { Database.SetInitializer(new DropCreateDatabaseAlways()); _dataCntx = new DataContext(CONNECTION_STRING); _dataCntx.Database.Initialize(true); } [TearDown] public void CleanUp() { _dataCntx.Dispose(); Database.Delete(CONNECTION_STRING); } } 

DataContext a une propriété comme celle-ci

  public DbSet Clients { get; set; } 

Comment forcer mon code à supprimer la firebase database? Merci

    Le problème est que votre application détient probablement encore une connexion à la firebase database (ou une autre application détient également la connexion). La firebase database ne peut pas être supprimée s’il existe une autre connexion ouverte. Le premier problème peut probablement être résolu en désactivant le regroupement de connexions (ajoutez Pooling=false à votre chaîne de connexion) ou effacez le pool avant de supprimer la firebase database (en appelant SqlConnection.ClearAllPools() ).

    Les deux problèmes peuvent être résolus en forçant la firebase database à supprimer, mais pour cela, vous avez besoin d’un initialiseur de firebase database personnalisé où vous basculez la firebase database en mode utilisateur unique et ensuite supprimez-la. Voici quelques exemples pour y parvenir.

    Je devenais fou avec ça! J’ai une connexion de firebase database ouverte dans SQL Server Management Studio (SSMS) et une requête de table ouverte pour voir le résultat de certains tests unitaires. Lors de la réexécution des tests dans Visual Studio, je souhaite que la firebase database soit toujours supprimée SI la connexion est ouverte dans SSMS.

    Voici le moyen définitif de se débarrasser de la Cannot drop database because it is currently in use :

    Initialisation de la firebase database Entity Framework

    L’astuce consiste à remplacer la méthode InitializeDatabase dans l’ Initializer personnalisé.

    Copié la partie pertinente ici pour le bien de la duplication … 🙂

    Si la firebase database existe déjà, vous risquez de rencontrer une erreur. L’exception «Impossible de déposer la firebase database parce qu’elle est actuellement utilisée» peut être déclenchée. Ce problème se produit lorsqu’une connexion active rest connectée à la firebase database en cours de suppression. Une astuce consiste à remplacer la méthode InitializeDatabase et à modifier la firebase database. Cela indique à la firebase database de fermer toutes les connexions et si une transaction est ouverte pour annuler celle-ci.

     public class CustomInitializer : DropCreateDatabaseAlways { public override void InitializeDatabase(YourContext context) { context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction , ssortingng.Format("ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE", context.Database.Connection.Database)); base.InitializeDatabase(context); } protected override void Seed(YourContext context) { // Seed code goes here... base.Seed(context); } } 

    Ceci est un (re) initialisateur de firebase database vraiment agressif pour le code EF en premier avec les migrations; utilisez-le à vos risques et périls, mais il semble que cela fonctionne assez souvent pour moi. Ce sera;

    1. Déconnecter de force tous les autres clients de la firebase database
    2. Supprimer le DB.
    3. Reconstruire la firebase database avec les migrations et exécute la méthode Seed
    4. Prenez des siècles! (surveillez le délai d’expiration de votre infrastructure de test; un délai d’attente de 60 secondes par défaut peut ne pas suffire)

    Voici la classe;

     public class DropCreateAndMigrateDatabaseInitializer: IDatabaseInitializer where TContext: DbContext where TMigrationsConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration, 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(); migrator.InitializeDatabase(context); } } 

    Utilisez-le comme ça;

     public static void ResetDb() { // rebuild the database Console.WriteLine("Rebuilding the test database"); var initializer = new DropCreateAndMigrateDatabaseInitializer(); Database.SetInitializerinitializer); using (var ctx = new MyContext()) { ctx.Database.Initialize(force: true); } } 

    J’utilise aussi le “Pooling = false” de Ladislav Mrnka, mais je ne suis pas sûr qu’il soit nécessaire ou juste une mesure de ceinture et d’accolade. Cela consortingbuera certainement à ralentir le test.

    Aucune de ces solutions n’a fonctionné pour moi. J’ai fini par écrire une méthode d’extension qui fonctionne:

     private static void KillConnectionsToTheDatabase(this Database database) { var databaseName = database.Connection.Database; const ssortingng sqlFormat = @" USE master; DECLARE @databaseName VARCHAR(50); SET @databaseName = '{0}'; declare @kill varchar(8000) = ''; select @kill=@kill+'kill '+convert(varchar(5),spid)+';' from master..sysprocesses where dbid=db_id(@databaseName); exec (@kill);"; var sql = ssortingng.Format(sqlFormat, databaseName); using (var command = database.Connection.CreateCommand()) { command.CommandText = sql; command.CommandType = CommandType.Text; command.Connection.Open(); command.ExecuteNonQuery(); command.Connection.Close(); } } 

    J’essaie d’append Pooling=false comme Ladislav Mrnka a dit mais a toujours eu l’erreur.
    J’utilise SQL Server Management Studio et même si je ferme toute la connexion, j’obtiens l’erreur.

    Si je ferme Sql Server Management Studio, la firebase database est supprimée 🙂
    J’espère que cela peut aider

    J’ai eu la même erreur. Dans mon cas, je viens de fermer la connexion à la firebase database puis de me reconnecter une fois que le nouveau modèle a été ajouté et qu’un nouveau contrôleur a été installé. C’est cependant une solution très simple et déconseillée pour tous les scénarios si vous souhaitez conserver vos données.

    J’ai eu le même problème à l’époque. La solution consiste à fermer la connexion dans l’onglet Explorateur de serveurs dans Visual Studio. Donc, vous pourriez peut-être vérifier si la connexion est toujours ouverte dans l’Explorateur de serveur.