sql - Entity Framework 4 Code First 出现数据库使用错误

标签 sql entity-framework code-first ef-code-first

我有一个 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 DATABASEDROP 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/

相关文章:

sql - 如何在 MySQL 中执行 FULL OUTER JOIN?

c# - EntityFramework 在执行更新查询时非常慢

entity-framework - Entity Framework 代码优先只读键

c# - Code First from Database - 无法将 NULL 值插入列 'Id',但值实际上不为 null

c# - 在哪里放置访问数据库的方法

mysql - 两个查询的执行是否有可能相互干扰

sql - Vertica/SQL,Case When 语法

MySQL:选择上次修改时具有一个属性但过去没有其他属性的项目

c# - LINQ 复杂查询导航属性

entity-framework - 使用 EF6 SQL Server CE Code First 创建数据库崩溃