1

我的网络应用程序有一个自我安装过程;它(正确地)检测到数据库未初始化,并(通过迁移)对其进行初始化;我也有自动化集成测试来测试在这些情况下的安装工作,以及冒烟测试登录和注册第一个用户(在安装表单上提供)。

我最近从 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                     
 }

不幸的是,我注意到了一个有趣的“错误”。当我编译我的服务器代码并运行我的安装测试时,它会在全新安装(空数据库)后通过(如预期的那样)。如果我立即再次运行测试,它会失败。

失败的原因?在我的安装测试中,我对所有数据库表进行了核对,并希望安装能够重新创建它们。但是,在这种情况下,WebSecurity.Initialized返回 true 而不是 false。所以,我从来没有打过第二行(初始化和创建表)。如果我把那条线移到外面,我会得到一个我正在双重初始化的异常。

不幸的是,我在这里真正需要的是一个类似的方法WebSecurity.CreateTables(),它不存在。因此,我陷入了僵局。我该如何处理?

此外,如果我尝试UserProfile自己重新创建表,我会遇到一个问题,即UserId(主键)被插入为空——大概是因为我错过了其他表。

我应该如何处理这种情况?

4

1 回答 1

0

我现在唯一的解决方法是重置 IIS。悲伤,但真实;这样做将重置WebSecurity.Initialized,一切正常。

由于我需要在应用程序启动时,我可以使用Process.Start.

于 2013-04-21T11:59:49.887 回答