在 Schema First 设计中,我使用 ApexSQL Diff(很可能与 RedGate 的产品非常相似,可能更便宜一些) -一个好的 3rd 方工具比 VS 数据库项目更容易使用,并且易于使用脚本应用程序工具应用像圆屋。
在 Model First 方法中使用它可以遵循 Schema First 方法,使用模型-Schema-Diff-Schema-Model 的循环,如帖子中所述;考虑以下这些指南/说明,以简化流程。模式差异方法不需要繁琐、缓慢或过度手动。
当前版本的数据库模式是通过应用一系列数据库补丁(或 DDL/DML 脚本)获得的。
一个工具(我们使用 RoundHouse)会根据需要自动应用脚本。它记录信息以了解已应用了哪些脚本。应用相同的脚本是幂等的。
对本地数据库进行差异化;这个本地数据库可以通过所有以前的更改脚本以自动方式建立起来。这个 latest-local 始终是最新模型更改的差异目标。
远程/实时数据库从不用作差异目标。稍后可以将相同的脚本应用于测试(然后是实时)数据库。由于一切都以相同的方式完成,因此该过程在所有数据库上都是可重复的。
唯一的“问题”是未经深思熟虑的更新可能会导致数据在新的限制/约束下无效。当然,在推送到实时数据库之前,这很容易识别、修复和重新比较。
一旦 diff 被提交到源代码控制,它就必须应用于分支。要“撤消”先前提交的更改脚本,需要创建一个应用反向操作的新差异。没有隐式的向下版本。
我们有一个 [Hg] 模型分支,它有效地充当必须统一针对的模式锁;这可以被视为一个弱点,但它在小团队开发中运作良好。
像 Huagati DBML/EDMX 这样的工具用于将 Schema 同步回 Model,这在开发时非常有用。这个小宝石确实为自己付出了代价,并且是周期的一部分。当使用它时,也很容易“更新到模型”或在 SSMS(或其他任何东西)中进行 Schema 更改,然后将它们带回来。
Code First 迁移是“好的”(绝对比没有好!),但我只使用它们是因为高级差异工具不支持 Azure SQL(又名 SQL 数据库),因为没有公开各种 sys 信息。(差异可以照常在本地完成,但 ApexSQL Diff 生成的 DDL/DML 并不总是与 Azure SQL 友好 - 另外,我有机会学习一种稍微不同的方法 :-)
通过 Power Pack 进行 Code First 迁移的一些优点:可以在 C# 中执行更新任务,而不是局限于 DDL/DML(可能很方便)、自动降级(虽然我质疑它们的使用)、不需要购买第 3 方工具(可能很昂贵),更容易集成/部署到 Azure SQL,与特定数据库供应商的联系更少(理论上)等。
虽然 Code First 迁移(以及此类迁移的自动化)与绝对可怕的 Drop-and-Recreate 方法相比是一个很好的进步,但我更喜欢在开发时使用专用的 SQL 工具。