3

データベースがファイル システムから削除された場合、データベース EF5/CodeFirstを再作成するためにどのように使用できますか?LocalDb

私が見つけたすべての記事で、移行の有効化または update-database の実行について説明しています。これは設計時にのみ関係します。

実行時に使用できるソリューションを探しています。

私はDropCreateDatabaseIfModelChangesカスタム初期化子として使用していますが、これは開発中およびデータベースが実行時に最初に作成されるときにうまく機能します。ただし、データベースが 2 回作成されることはありません。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 に答える