使用实体框架删除数据库

本文关键字:删除 数据库 框架 实体 | 更新日期: 2023-09-27 18:33:23

我正在尝试使用实体框架从我的应用程序中删除数据库。我使用的代码如下:

using (var dbContext = container.Resolve<ApplicationDbContext>())
    {
      dbContext.Database.Delete();
    }

根据 msdn,这应该有效,但没有任何反应。

dbContext 是使用 ContainerControlledLifetimeManager 注册的,并且应该是用于创建数据库的同一实例。

使用实体框架删除数据库

添加、更新和删除实体类型的实例需要dbContext.SaveChanges()以反映更改。

但是dbContext.Database.Delete()不需要dbContext.SaveChanges()

例如,如果打开从 Sql Management Studio 到数据库的连接并尝试dbContext.Database.Delete()则会收到Cannot drop database "dbContext" because it is currently in use.如果重新启动 SQL Server,则会删除这些连接,然后在成功删除数据库dbContext.Database.Delete()重试。

最后一件事是在Sql Management Studio中刷新数据库列表,以查看该数据库不再存在。

使用以下代码片段进行测试:

using (var dbContext = new dbContext())
{
    dbContext.Database.Delete();
}

在@moguzalp和这个(MSDN Database.Delete Function)之后,我为我的情况提供了一个解决方案:

using System.Data.Entity;
Database.Delete("connectionStringOrName");

就我而言,我试图重新创建一个 mssqllocalDb 数据库以进行测试。但是每当我使用相同的 DbContext(或立即使用新的 DbContext,处理第一个并打开另一个)时,当我尝试创建它时,看起来数据库仍然处于运行状态。

错误示例:(x)

public static void RecreateDatabase(string schemaScript)
{   
    using (DbContext context = new DbContext("connectionStringName"))
    {
        context.Database.Delete(); // Delete returns true, but...
        Database database = context.Database;
        database.Create(); // Database already exists!
        database.ExecuteSqlCommand(schemaScript);
    }
}

工作示例:(/)

public static void RecreateDatabase(string schemaScript)
{   
    Database.Delete(); // Opens and disposes its own connection
    using (DbContext context = new DbContext("connectionStringName")) // New connection
    {
        Database database = context.Database;
        database.Create(); // Works!
        database.ExecuteSqlCommand(schemaScript);
    }
}

上下文:我在 [AssemblyInitialize] 函数上使用它来测试我的模型上下文

您的所有更改都发生在局部变量 dbcontext 上。

这是最后一次踢>在你的使用块结束时添加dbContext.SaveChanges();,如下所示:

 using (var dbContext = container.Resolve<ApplicationDbContext>())
{
  dbContext.Database.Delete();
  dbContext.SaveChanges();
}