我有一个ASP.NET MVC 5项目,该项目在本地运行,每当我需要清理数据库时,我只需在其上打开一个新查询,将可用数据库下拉列表更改为master,然后关闭本地数据库上的连接并运行查询"drop database[name]".然后我构建项目,进入package manager控制台并运行"更新数据库".这似乎重建了一个新的本地数据库,并在我的配置中运行seed方法.cs文件.

问题是,当我需要在一个实时环境中测试一些东西,以便能够更好地测试API时,我会将其部署到Azure网站和附带的Azure DB,这很好,也很容易做到.我在发布向导中勾选了"执行代码优先迁移",大部分时间它都可以运行,我可以运行和调试我的实时版本.有时我需要把数据库吹走,重新从头开始,但我真正找到的唯一方法是进入Azure门户,删除数据库,然后用相同的名称重新创建它.Azure需要一些时间来处理,所以这是一个缓慢的测试周期.

Is there a quick way to just drop/reset a Azure SQL DB to it's fresh, empty, virgin state and then re-publish with "execute code first migrations" to have it re-create the tables and re-seed the data?

我看到过一些关于在创建db之后创建初始迁移的讨论,然后try 使用Powershell回滚到初始状态,但我还没有成功让它工作,我想同时删除所有数据.也许我只是语法错误,或者没有找到足够好的教程.虽然我可以在Azure DB上运行一个查询来"删除数据库[x]",但它确实会像您预期的那样杀死SQL Azure DB实例,您需要返回门户重新创建它.有时,初始状态不好,因为模型已经更新,所以这可能无论如何都没有用.

我觉得应该有一些更简单、更快的方法来测试实时环境中的更改,因为MS提供了所有这些伟大的工具和快捷方式,但他们是在这个开发阶段把球扔到这里,还是我遗漏了什么?

推荐答案

因为据我所知,没有一种API方法可以做到这一点,所以我们使用了this script to leverage a T-SQL query to clear the database.

删除每个表(如果需要,还可以保留您的EF迁移历史记录)

while(exists(select 1 from INFORMATION_SCHEMA.TABLES 
             where TABLE_NAME != '__MigrationHistory' 
             AND TABLE_TYPE = 'BASE TABLE'))
begin
 declare @sql nvarchar(2000)
 SELECT TOP 1 @sql=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME
 + ']')
 FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_TYPE = 'BASE TABLE'
exec (@sql)
 /* you dont need this line, it just shows what was executed */
 PRINT @sql
end

如果需要,请先删除外键

while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
 declare @sql nvarchar(2000)
 SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME
 + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
 FROM information_schema.table_constraints
 WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
 exec (@sql)
 PRINT @sql
end

在我的测试中,这没有问题(除了我在查询时的DROP表中没有where子句,因为我没有使用代码优先或EF迁移).

Asp.net相关问答推荐

Razor中的共享本地化资源文件

为什么 @Html.EditorFor 和 @Html.PasswordFor 在 MVC 中创建不同的样式框?

我可以强制刷新我的样式表文件吗?

我可以在一个 Web 项目中有多个 web.config 文件吗?

文本框的输入按键触发事件

在 Asp.net mvc5 中使用用户名而不是邮箱作为身份

如何从 ASP.Net 发布然后重定向到外部 URL?

IIS Express 安装目录在哪里?

如何从 NuGet 安装 EntityFramework 5.0(和其他旧版本)?

如何将参数传递给 ASP.NET MVC 2 中的自定义 ActionFilter?

覆盖静态方法

ASP.NET 5、EF 7 和 SQLite - SQLite 错误 1:没有这样的表:博客

如何遍历自定义 vb.net 对象的每个属性?

ASP.NET MVC 和 httpRuntime executionTimeout

ASP.NET 中的嵌套中继器

ASP.NET MVC 5 Web.config:FormsAuthenticationModule或FormsAuthentication

ASP.NET 5 (vNext) - 获取配置设置

将字符串转换为时间

在 Visual Studio 2013 中更改项目端口号

中继器中的中继器