私のWebアプリには自己インストールプロセスがあります。データベースが初期化されていないことを(正しく)検出し、(移行を介して)初期化します。また、このような状況でインストールが機能することをテストする自動統合テストと、ログインして最初のユーザーを登録するスモークテスト(インストールフォームで提供)もあります。
最近、MVC3からMVC4に切り替えました。組み込みのストレージプロバイダーを使用しました(MVC3ではaspnet_*
テーブル、MVC4ではWebSecurity
テーブルUserProfile
)。
.SQLファイルからすべてのMVC3ストアドプロシージャを手動で実行する代わりに、。を呼び出すようになりましたWebSecurity.InitializeDatabaseConnection
。実際、私のコードスニペットは次のとおりです。
if (!WebSecurity.Initialized)
{
WebSecurity.InitializeDatabaseConnection("ApplicationServices", "UserProfile", "UserId", "UserName", true);
MigrationsWrapper.MigrateToLatestVersion(); // wrapper around migratordotnet
}
残念ながら、興味深い「バグ」に気づきました。サーバーコードをコンパイルしてインストールテストを実行すると、フレッシュインストール(空のデータベース)の後で(予想どおりに)合格します。すぐにもう一度テストを実行すると、失敗します。
失敗の理由は?私のインストールテストでは、すべてのDBテーブルを削除し、インストールによってそれらが再作成されることを期待しています。ただし、この場合、WebSecurity.Initialized
falseではなくtrueを返します。したがって、2行目には決してヒットしません(テーブルの初期化と作成)。その行を外側に移動すると、二重初期化しているという例外が発生します。
残念ながら、ここで本当に必要なのは、のようなメソッドですがWebSecurity.CreateTables()
、これは存在しません。したがって、私は行き詰まりに陥っています。これをどのように処理しますか?
また、UserProfile
自分でテーブルを再作成しようとすると、 UserId
(主キー)がnullとして挿入されるという問題が発生します。おそらく、他のテーブルが欠落しているためです。
このシナリオをどのように処理する必要がありますか?