使用实体框架删除数据库
本文关键字:删除 数据库 框架 实体 | 更新日期: 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();
}