在模式优先的设计中,我使用 ApexSQL Diff(可能与 RedGate 的产品非常相似,也许便宜一点)- 第三方工具比 VS 数据库项目更容易使用,并且可以在像 RoundHousE 这样的脚本应用程序工具中轻松应用。
在模型优先方法中使用它可以遵循模式优先方法,使用 Model-Schema-Diff-Schema-Model 周期,如文章所述;请考虑下面的指南/说明,以使流程更加简化。模式差异方法不需要繁琐、缓慢或过度手动。
1. 通过应用数据库补丁序列(或 DDL/DML 脚本)获取数据库架构的当前版本。
工具(我们使用 RoundHousE)会根据需要自动应用脚本。 它记录信息以知道哪些脚本已被应用。 应用相同的脚本是幂等的。
2. 对本地数据库进行差分; 可以以自动方式建立此最新本地数据库,其中包含所有先前的更改脚本。 此最新本地数据库始终是最新模型更改的差分目标。
远程/实时数据库永远不用作差分目标。稍后可以将相同的脚本应用于测试(然后是实时)数据库。由于一切都是以相同的方式完成,因此该过程可在所有数据库上重复执行。
唯一的“问题”是,考虑不周的更新可能导致数据在新的限制/约束下无效。 当然,这很容易在推送到实时数据库之前识别、修复和重新差分。
3. 一旦将差异提交到源代码控制中,就必须在分支上应用它。 要“撤消”以前提交的更改脚本需要创建一个新的差分并应用相反的操作,没有隐含的下版本。
我们有一个[Hg]模型分支,有效地充当模式锁定,必须与之统一; 这可能被视为一个弱点,但对于小团队开发而言,它已经运作良好。
4. 使用像 Huagati DBML/EDMX 这样的工具将模式同步回模型,在开发时真的非常有用。 这个小宝石真正为自己赚钱,并且是周期的一部分。当使用此功能时,也很容易“更新到模型”或在 SSMS(或其他工具)中进行模式更改,然后将其带回来。
Code First 迁移还可以接受(绝对比什么都不做好!),但我之所以只使用它们,是因为 Azure SQL(也称为 SQL Database)不支持高级差异工具,因为它不会提供各种 sys 信息。 (可以像通常一样在本地执行差分,但 ApexSQL Diff 生成的 DDL/DML 不总是适用于 Azure SQL - 而且这是我学习稍微不同方法的机会 :-)
通过Power Pack进行Code First迁移的一些优点:可以在C#中执行更新任务,而不仅限于DDL/DML(可能很方便),自动降级(虽然我质疑它们的用途),不需要购买第三方工具(可能很昂贵),更容易集成/部署到Azure SQL,理论上不太与特定数据库供应商相关等。
虽然Code First迁移(及其自动化)是相对于完全可怕的删除和重新创建方法的一大进步,但在开发时,我更喜欢专用的SQL工具。