私はこのエラーに遭遇していました
An attempt to attach an auto-named database for file C:\<...>\Out\MessagesDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share..
コントローラーをテストするための単体テストを作成しようとしています。問題は、メイン プロジェクトで定義したデータベースをテストが使用しないようにしようとしていたことだと思いました。そこで、テストの接続文字列を次のように変更しました
私が使用しているテスト プロジェクトの App.config で
<connectionStrings>
<add name="MessagesDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MessagesDB.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
そして、次のようにして DataDirectory を上書きしました
AppDomain ドメイン = AppDomain.CurrentDomain;
String currentDirectory = System.Environment.CurrentDirectory;
String DataDirectory = currentDirectory.Substring(0, currentDirectory.IndexOf("TestResults")) + "Server\\App_Data";
domain.SetData("DataDirectory", DataDirectory);
db = new Server.Models.MessagesDBDataContext();
これはうまく機能しますが、ハックのように見えます。これをどのように行うべきでしたか?
編集:
今日、このひどい混乱をもう一度見て、Nerd Dinner の例に基づいて、プロジェクトのコントローラーからデータベースへのすべての直接呼び出しを削除し、それらをインターフェイス (IRepository) を実装するリポジトリ オブジェクトに移動しました。次に、IRepository も実装した偽のリポジトリ オブジェクトを作成しました。IRepository を使用できるようにするコンストラクターを各コントローラーに追加しました。その後、デフォルトのコントローラ コンストラクタが変更され、リポジトリが初期化されました。テストはデータベースと対話しなくなったため、より高速で破壊的ではなくなりました。