我正在寻找一种方法来进行日常部署,并使数据库脚本与发行版保持一致.

目前,我们有一个相当不错的方法来部署我们的源代码,我们有单元代码覆盖、持续集成和回滚过程.

问题在于让数据库脚本与发布保持一致.每个人似乎都会在测试数据库上try 该脚本,然后在live上运行它们,当ORM映射更新时(即更改生效),它会 Select 新列.

第一个问题是,没有脚本必须在任何地方编写,通常每个人都"try "将它们放到Subversion文件夹中,但一些懒惰的人只是在现场运行脚本,大多数时候没有人知道谁对数据库做了什么.

第二个问题是,我们有4个测试数据库,它们总是不符合要求,唯一能让它们真正符合要求的方法是从实时数据库进行恢复.

我非常相信,这样的过程需要简单、直接和易于使用,以便帮助开发人员,而不是阻碍他们.

我要寻找的是一些技术/ idea ,使开发人员能够轻松地记录他们的数据库脚本,以便它们可以作为发布过程的一部分运行.A process that the developer would want to follow

任何故事、用例甚至一个链接都会很有帮助.

推荐答案

对于这个问题,我 Select 使用迁移工具:Migratordotnet.

对于迁移(在任何工具中),您都可以使用一个简单的类来执行更改并撤销它们.下面是一个例子:

[Migration(62)]
public class _62_add_date_created_column : Migration
{
    public void Up()
    {
       //add it nullable
       Database.AddColumn("Customers", new Column("DateCreated", DateTime) );

       //seed it with data
       Database.Execute("update Customers set DateCreated = getdate()");

       //add not-null constraint
       Database.AddNotNullConstraint("Customers", "DateCreated");
    }

    public void Down()
    {
       Database.RemoveColumn("Customers", "DateCreated");
    }
}

这个例子展示了如何处理易失性更新,比如向包含现有数据的表中添加一个新的非空列.这可以很容易地实现自动化,并且您可以很容易地在不同版本之间进行上下转换.

这对我们的构建来说是一个非常有价值的补充,并且简化了流程.

我在文章中比较了各种迁移框架.净收入:http://benscheirman.com/2008/06/net-database-migration-tool-roundup

Asp.net相关问答推荐

单个方法(即扩展方法)之间的调用不明确

asp.net dropdownlist - 在 db 值之前添加空行

返回 HttpResponseMessage 时的 WebAPI Gzip

System.Web.Helpers.Crypto - 盐在哪里?

我可以根据角色隐藏/显示 asp:Menu 项吗?

如何在 ASP.NET Web 窗体中使用依赖注入

我可以创建 .config 文件并将其包含到 web.config 中吗?

如何在 ASP.NET 应用程序中使用 jQuery 捕获提交事件?

在 ASP.NET Core 1.0 上处理大文件上传

HTTP 错误 503.该服务在简单的 ASP.NET 4.0 网站下不可用

Razor 主机工厂错误

回发后 Document.Ready() 不起作用

在 Android/Java 和 C# 中计算 SHA256 哈希

<%# Eval("State") %> 或 <%# DataBinder.Eval(Container.DataItem, "state")%>

.NET AJAX 调用 ASMX 或 ASPX 或 ASHX?

HttpResponse.End 或 HttpResponse.Close 与 HttpResponse.SuppressContent

头标记中的内联代码 - ASP.NET

MSBuild DeployOnBuild=true 不发布

为什么在 MVC4 Razor 布局文件中无法识别 @Scripts 和 @Styles 命令?

ASP.NET - 从静态方法/静态类访问会话?