3

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

我发现的所有文章都讨论了启用迁移或运行更新数据库。这仅与设计时间有关。

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

DropCreateDatabaseIfModelChanges用作自定义初始化程序,这在开发过程中以及在运行时首次创建数据库时效果很好。但是,例如,永远不会再次创建数据库;如果用户LocalDb从文件系统中删除数据库。

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

提前致谢。

4

2 回答 2

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;
        }
    }
于 2013-08-12T14:39:29.973 回答
1

You can try this EF 5, Code First - Create a new database and run all migrations programatically

Alternatively I would check if the database file exists then if the file was deleted then I would connect to master database and execute delete command and then try to create the context...

于 2013-08-12T14:35:26.227 回答