我的网络应用程序有自我安装过程;它(正确地)检测到数据库未初始化,并初始化它(通过迁移);我还有自动集成测试,可以在这些情况下测试安装工作,并且烟雾测试登录并注册第一个用户(在安装表单上提供)。
我最近从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
(主键)插入为null的问题 - 大概是因为我错过了其他表。 / p>
我该如何处理这种情况?
答案 0 :(得分:0)
我现在唯一的解决办法是重置IIS。悲伤,但是真的;这样做会重置WebSecurity.Initialized
,一切正常。
由于我需要在app启动时,我可以使用Process.Start
以编程方式重置IIS。