如果EF5/CodeFirst
数据库从文件系统中删除,如何使用它来重新创建LocalDb
数据库?
我发现的所有文章都讨论了启用迁移或运行update-database。这只涉及设计时间。
我正在寻找可以在运行时使用的解决方案。
我正在使用DropCreateDatabaseIfModelChanges
作为自定义初始化程序,这在开发期间以及首次在运行时创建数据库时非常有用。但是,例如,数据库永远不会第二次创建;如果用户从文件系统中删除LocalDb
数据库。
我尝试手动创建数据库,虽然文件已成功创建,但永远不会生成schema
(错误为"Model compatibility cannot be checked because the database does not contain model metadata."
)。
提前谢谢。
答案 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命令,然后尝试创建上下文......