使用实体框架进行部署后数据库更改的最佳实践

Shu*_*aib 3 asp.net entity-framework ef-database-first

我正在开发一个ASP.NET Web Forms项目,即使在部署之后,该项目也会经历大量的数据库更改.

我们倾向于使用Entity Framework 5和Database First设计范例.但是,由于我们必须在部署之后对数据库进行大量更改,如果我使用数据库优先方法,那么每次更新数据库时,我都必须删除整个模型并重新生成它.是否有任何最佳实践可以减少这个过程的痛苦?

Jot*_*aBe 7

您应该使用Code First,以便可以使用迁移.

更具体地说,我使用手动迁移.

通过手动迁移,您可以随时创建迁移.迁移具有以下信息:

  • 当前模型的快照
  • 从上一次迁移升级的一组"说明"
  • 一组降级到上一次迁移的"指令"

除了必要的迁移之外,您还应在部署应用程序时添加新的迁移.例如,当您部署应用程序的1.0版时,可以创建名为"Version 1.0"的迁移.

完成每个新的稳定版本后,只需添加一个新的迁移,例如"版本1.1"或"版本1.2".

当您拥有已部署的应用程序版本并且需要升级(或降级)到新版本时,迁移的有趣部分会显示出来.

有些命令可以让您将数据库从一个特定版本升级(或降级)到另一个特定版本.您可以直接指定与DB的连接,也可以创建将更改应用于DB的SQL脚本.例如,如果您在客户服务器中部署了1.0版,并且需要将软件升级到1.2版,则可以执行以下操作:

Update-Database -SourceMigration "Version 1.0" -TargetMigration "Version 1.2" 
      -Script
Run Code Online (Sandbox Code Playgroud)

这将创建一个SQL脚本,可以在DB上运行以从1.0版升级到1.2.

如果您需要有关任何迁移命令的帮助,只需键入:

get-help Update-Database -full
Run Code Online (Sandbox Code Playgroud)

(Update-Database是一个命令名,你可以指定任何其他像Add-Migration)

您可能需要指定模型所在的项目,连接字符串名称,带有.config文件的项目名称或其他一些内容,具体取决于指定的参数以及解决方案中项目的结构.

要获得有关迁移的更多信息,请阅读MSDN EF Code First Migration.

注意在版本中添加:有一个新的数据库初始化程序,可以在应用程序运行时自动迁移到最新版本.我曾经在一个真正的应用程序中工作过,它就像一个魅力.

替代SSDT

如果您不想遵循建议,可以使用SQL Server数据工具(可以安装在VS中,也可以作为独立的应用程序,具体取决于您使用的版本).

此工具的想法是您可以将项目(数据库模式快照)与现有数据库进行比较,并生成脚本以更改数据库以匹配项目中的模式.(实际上你可以比较项目和DB的任何组合)

如果您在CVS中保留项目的版本,您甚至可以检查从项目的一个版本到项目的其他版本的更改.

注释增加版本: SSDT项目是一组脚本,可以构建整个数据库,包括其模式中的所有对象.您可以从现有数据库创建它,也可以反之.然后,您可以继续比较DB和SSDT项目的任何组合,作为soruce或target,并创建应用脚本所需的更改每个具有更改的特定对象.(创建脚本是为了更改目标,使其看起来像源,但您可以轻松地交换源和目标)

这是一种替代解决方案,但迁移功能更强大,因为您可以自定义它们,例如在创建它时填充"主表",设置新列的初始值等等.如果您使用SSTD,您必须手动完成所有这些操作,并仔细跟踪它.所以我强烈建议使用迁移.

  • 如果您具有正确的CI流程设置,则重新发布您的c#代码不需要花费很多精力.此外,如果由于数据库更改(我认为大多数情况下)需要更改代码,例如,查询新添加的列,则无论如何都必须部署代码. (2认同)