使用Entity Framework删除数据库

6

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

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

根据msdn,这应该可以工作,但什么也没有发生。
dbContext使用ContainerControlledLifetimeManager注册,并且应该是用于创建DB的相同实例。
3个回答

3

添加、更新和删除实体类型的实例需要使用 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();
}

尝试使用 using (var dbContext = new ApplicationDbContext()) - asdf_enel_hak
尝试过了,但没有用。数据库仍然存在。 - memory of a dream
@memoryofadream,我在我的电脑上测试了该问题,请查看更新,希望这次能解决您的问题。 - asdf_enel_hak
抱歉这么久没联系。最近我一直在忙其他的事情。 我相信我现在理解了问题。 数据库仍然被当前应用程序使用,这就是为什么我无法删除它。看起来像是一个鸡生蛋的问题。 我已经尝试完全处理db上下文并创建一个新的,但没有成功。 我想从创建它的同一进程中删除DB,而不必重新启动sql。否则,我可以在应用程序关闭后手动删除它,没有任何困难。 - memory of a dream
变得有趣了。我没有尝试从应用程序中创建和删除。根据您的报告和我的尝试,操作只能在现有数据库上执行... - asdf_enel_hak

1

在参考@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] 函数上测试我的 ModelContexts


0

您所做的所有更改都发生在本地变量 dbcontext 上。

这是最后一步 > 在您的 using 块末尾添加 dbContext.SaveChanges();,如下所示:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接