我有一个 MVC3 和 EF 4 Code First 应用程序,该应用程序配置为在模型更改时更改数据库,方法是将数据库初始化程序设置为 DropCreateDatabaseIfModelChanges<TocratesDb>
,其中TocratesDb
是我导出的DbContext
.
我现在通过向类添加属性来对模型进行了更改,但是当 EF 尝试删除并重新创建数据库时,我收到以下错误:
Cannot drop database "Tocrates" because it is currently in use.
我在该数据库上绝对没有打开任何其他连接。我假设我的 cDbContext 仍然与数据库有一个打开的连接,但是我能做什么呢?
新:现在我的问题是如何根据模型重新创建数据库。通过使用更通用的 IDatabaseInitializer,我失去了它并且必须自己实现它。
最佳答案
您当前的上下文必须有一个打开的连接才能删除数据库。问题是可能有其他打开的连接会阻止您的数据库初始值设定项。一个非常好的例子是在 Management Studio 中打开数据库中的任何表。另一个可能的问题可能是应用程序连接池中打开的连接。
在 MS SQL 中,可以通过将数据库切换到单用户模式并强制关闭所有连接并回滚不完整的事务来避免这种情况:
ALTER DATABASE Tocrates SET SINGLE_USER WITH ROLLBACK IMMEDIATE
您可以创建一个新的初始化程序,它将首先调用此命令,然后删除数据库。请注意,您应该自己处理数据库连接,因为必须在同一连接上调用 ALTER DATABASE
和 DROP DATABASE
。
编辑:
这里有使用装饰器模式的示例。您可以修改它并在构造函数内初始化内部初始值设定项,而不是将其作为参数传递。
public class ForceDeleteInitializer : IDatabaseInitializer<Context>
{
private readonly IDatabaseInitializer<Context> _initializer;
public ForceDeleteInitializer(IDatabaseInitializer<Context> innerInitializer)
{
_initializer = innerInitializer;
}
public void InitializeDatabase(Context context)
{
context.Database.SqlCommand("ALTER DATABASE Tocrates SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
_initializer.InitializeDatabase(context);
}
}
关于sql - Entity Framework 4 Code First 出现数据库使用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5288996/