SQL Server项目或本地mdf文件的持续集成最佳实践

25

今天我在维护一个项目,它的数据库很混乱,需要进行大量的重构,并发布到客户机器上。

我知道可以添加一个只包含数据库脚本的 SQL Server 数据库 项目,并创建一个 .dacpac 文件,从而允许我自动更改客户端的数据库。

此外,我知道可以将一个 .mdf 文件添加到 App_Data 目录甚至是 Solution_Data 文件夹中,并在那里放置我的数据库。我想已经存在的 localDb 允许我在没有 SQL Server 的情况下启动我的解决方案

最后,我知道 Entity Framework 存在其自己的迁移。但我不想使用它,因为它的迁移无法添加和更改索引,而且当我需要描述复杂的迁移场景时,我没有足够的灵活性。

我的目标:

  1. 自动生成迁移脚本以自动更新客户的数据库。
  2. 使我的解决方案自包含,任何新加入项目的程序员都不需要在自己的机器上安装 SQL Server。
  3. 能够在1-2次点击中更新本地(开发)数据库。
  4. 能够回溯数据库更改历史记录(我有 TFS 服务器)
  5. 能够在解决方案中拥有干净的(仅带词典或查找表)数据库,并具有最新的数据库结构。
  6. 此外,我想能够自动或非常容易地更新我的 DB 模型 (EF.dbml)。

所以我想问:

  • 如果我想实现我的目标,使用这两种方法的优缺点是什么?

  • 我是否应该使用这些工具的一种组合方式?

  • 或者我不知道其他来自 MS 的现有工具吗?

  • 有没有一种方法可以从这个数据库更新我的 DAL 模型?


嗯,LocalDB是SQL Server Express的另一个面向开发人员的版本 - 如果您想在本地机器上使用.mdf文件,则必须安装 SQL Server Express。如果您将数据库放置在网络上的服务器上(它确实属于那里),则可以连接任意数量的计算机而无需安装本地SQL Server副本。 - marc_s
@marc_s 感谢您提供这个重要细节。但是我知道 SQL Express 是随 VS 一起提供的,所以您不需要单独安装它,我是正确的吗? - teo van kot
在开发机上,SQL Server Express 和 LocalDB 与 Visual Studio 一起安装(除非您在安装程序中明确取消选择它们)。 - marc_s
您可以使用EF(在模型中使用注释)添加索引,请参见http://www.c-sharpcorner.com/UploadFile/ff2f08/index-attribute-with-entity-framework-6-1/和https://msdn.microsoft.com/en-us/data/jj591583.aspx。 - Steve Ford
@SteveFord 是的,我可以,但是我无法在编译时验证它们,并且这是EF的扩展。而在SQL项目中,我可以在构建时验证整个项目并查看所有错误。 - teo van kot
2个回答

10
如果我想达到我的目标,使用这两种方法的优缺点是什么?
使用数据库项目可以对所有数据库对象进行版本控制。您可以发布到各种数据库实例并逐步推出更改,而不必删除和重新创建数据库,从而保留数据。这些更改可以采用dacpac、SQL脚本或直接通过VS界面完成。您可以使用预部署和后部署脚本以及发布配置文件来控制部署。开发人员需要安装SQL Server(通常使用开发人员/Express版即可)。
LocalDB更易于使用——您可以直接在数据库中进行更改而无需发布。LocalDB没有将更改推送到其他实例的内置发布过程。无需安装SQL Server。
如果您需要对数据库对象进行版本控制,有多个用户同时进行更改,或者有多个使用同一数据库的应用程序,请使用数据库项目。如果没有这些条件,或者需要自己独立的小型应用程序,则使用LocalDB。
我是否应该使用这些工具的组合?

是的。根据下面Kevin的评论,“如果将数据库项目设置为启动项目,按F5将自动将其部署到LocalDB。在这种情况下,您甚至不需要发布配置文件。”

或者我不知道其他来自MS的现有工具吗?

Entity Framework的Code First方法接近。

有没有一种方法可以从这个数据库更新我的DAL模型?

Entity Framework的POCO生成器效果很好,除非您对DAL类进行更改,否则下次运行生成器时这些更改会丢失。

有一个新工具叫做SqlSharpener,它可以从数据库项目中的SQL文件生成类。我没有使用过它,所以无法担保它,但它看起来很有前途。


1
我阅读了很多关于Code First和EF迁移的内容,但我不喜欢这种方法,因为你无法轻松创建索引,并且在复杂的迁移场景中没有很好的控制。 - teo van kot
5
如果将数据库项目设置为您的启动项目,按下F5将自动部署到LocalDB。在这种情况下,您甚至不需要发布配置文件。 - Kevin Cunnane

1
生成客户端脚本以进行数据库更改的一种方法是使用数据库建模工具,例如ERWin ,它有一个免费的社区版。满足您的数据库版本控制要求并轻松生成脚本的最佳方法是Redgate SQL Source Control。使用Redgate工具,您将实现前五个目标。此外,在更改DB模式(即数据库优先方法)后,您现在可以通过单击更新EF Model以满足目标6。
我不建议完全使用LocalDB。它总是会出现与源代码控制相关的问题,例如“DB文件正在使用中,无法提交...”。此外,在项目中的开发人员将没有共同的已更新数据集可供使用,除非开发人员向数据库添加测试数据并要求其他人获取最新版本并覆盖自己的数据库,或者使用上述工具生成更新脚本并要求每个开发人员在其LocalDB上运行它。 在您的情况下,最好的方法是在网络上使用SQL Server。所有开发人员都使用的主版本。由于您使用了先前提到的工具对数据库进行了版本控制,因此可以回滚数据库服务器中的任何错误更改。
如果您认为RedGate工具对项目预算来说太昂贵,第二种方法是从数据库生成单个SQL文件,该文件包含所有数据库对象,其他开发人员根据其更改在源代码控制中更新SQL文件。这可以通过使用Visual Studio中的模式比较工具轻松完成,并将生成的脚本附加到源代码控制中的SQL文件中。使用EF DB First方法,您无需像EF Code first那样添加许多迁移类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接