我们倾向于使用Entity Framework 5和Database First设计范例.但是,由于我们必须在部署之后对数据库进行大量更改,如果我使用数据库优先方法,那么每次更新数据库时,我都必须删除整个模型并重新生成它.是否有任何最佳实践可以减少这个过程的痛苦?
您应该使用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
这将创建一个SQL脚本,可以在DB上运行以从1.0版升级到1.2.
如果您需要有关任何迁移命令的帮助,只需键入:
get-help Update-Database -full
(Update-Database是一个命令名,您可以指定任何其他类似Add-Migration)
您可能需要指定模型所在的项目,连接字符串名称,带有.config文件的项目名称或其他一些内容,具体取决于指定的参数以及解决方案中项目的结构.
要获得有关迁移的更多信息,请阅读MSDN EF Code First Migration.
注意在版本中添加:有一个新的数据库初始化程序,可以在应用程序运行时自动迁移到最新版本.我曾经在一个真正的应用程序中工作过,它就像一个魅力.
替代SSDT
如果您不想遵循建议,可以使用SQL Server数据工具(可以安装在VS中,也可以作为独立的应用程序,具体取决于您使用的版本).
此工具的想法是您可以将项目(数据库模式快照)与现有数据库进行比较,并生成脚本以更改数据库以匹配项目中的模式. (实际上你可以比较项目和DB的任何组合)
如果您在CVS中保留项目的版本,您甚至可以检查从项目的一个版本到项目的其他版本的更改.
注释增加版本:SSDT项目是一组脚本,可以构建整个数据库,包括其模式中的所有对象.您可以从现有数据库创建它,也可以反之.然后,您可以继续比较DB和SSDT项目的任何组合,作为soruce或target,并创建应用脚本所需的更改每个具有更改的特定对象. (创建脚本是为了更改目标,使其看起来像源,但您可以轻松地交换源和目标)
这是一种替代解决方案,但迁移功能更强大,因为您可以自定义它们,例如在创建它时填充“主表”,设置新列的初始值等等.如果您使用SSTD,您必须手动完成所有这些操作,并仔细跟踪它.所以我强烈建议使用迁移.