如果DB被删除,如何使用Code First创建LocalDB?

时间:2013-08-12 14:10:41

标签: entity-framework c#-4.0 ef-code-first

如果EF5/CodeFirst数据库从文件系统中删除,如何使用它来重新创建LocalDb数据库?

我发现的所有文章都讨论了启用迁移或运行update-database。这只涉及设计时间。

我正在寻找可以在运行时使用的解决方案。

我正在使用DropCreateDatabaseIfModelChanges作为自定义初始化程序,这在开发期间以及首次在运行时创建数据库时非常有用。但是,例如,数据库永远不会第二次创建;如果用户从文件系统中删除LocalDb数据库。

我尝试手动创建数据库,虽然文件已成功创建,但永远不会生成schema(错误为"Model compatibility cannot be checked because the database does not contain model metadata.")。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

想出来......当你想到它时,实际上很合乎逻辑/很容易。

创建数据库后,LocalDb会挂起到目录名称。并且,在此应用程序中,由于目录的名称是静态的,因此LocalDb了解数据库已经初始化。正式分离数据库(即使它不在文件系统上)将导致LocalDb在下次调用期间将其视为新目录。

这是分离代码。我建议只有在检查确保文件确实丢失后才能从访问者中调用它...

    public static bool DetachDatabase(string dbName)
    {
        try
        {
            string connectionString = String.Format(@"Data Source=(LocalDB)\v11.0;Initial Catalog=master;Integrated Security=True");
            using (var connection = new SqlConnection(connectionString))
            {
                connection.Open();
                SqlCommand cmd = connection.CreateCommand();
                cmd.CommandText = String.Format("exec sp_detach_db '{0}'", dbName);
                cmd.ExecuteNonQuery();

                return true;
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            return false;
        }
    }

答案 1 :(得分:1)

您可以尝试此EF 5, Code First - Create a new database and run all migrations programatically

或者我会检查数据库文件是否存在,然后如果文件被删除,那么我将连接到master数据库并执行delete命令,然后尝试创建上下文......