1

私の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.Initializedfalseではなくtrueを返します。したがって、2行目には決してヒットしません(テーブルの初期化と作成)。その行を外側に移動すると、二重初期化しているという例外が発生します。

残念ながら、ここで本当に必要なのは、のようなメソッドですがWebSecurity.CreateTables()、これは存在しません。したがって、私は行き詰まりに陥っています。これをどのように処理しますか?

また、UserProfile自分でテーブルを再作成しようとすると、 UserId(主キー)がnullとして挿入されるという問題が発生します。おそらく、他のテーブルが欠落しているためです。

このシナリオをどのように処理する必要がありますか?

4

1 に答える 1

0

私が今持っている唯一の回避策は、IISをリセットすることです。悲しいですが本当; これを行うとリセットされWebSecurity.Initialized、すべてが機能します。

アプリの起動時に必要なので、プログラムでIISをリセットできますProcess.Start

于 2013-04-21T11:59:49.887 に答える