采用模型优先方法在实体框架中进行迁移。

14

我已经建立了一个系统,采用了模型优先的方法,因为这对我来说更有逻辑意义。现在,即使我对模型进行了一些更改,我的操作步骤如下:

  1. 使用实体框架(Entity Framework)的从模型生成数据库功能。我创建一个虚拟数据库并应用这些脚本,它会先删除所有数据和表,然后使用实体框架生成的最新SQL文件来更新数据库。
  2. 现在我使用Visual Studio的模式比较功能,并为我的本地数据库以及生产环境中的数据库生成迁移脚本。
  3. 我手动浏览脚本并进行验证。完成后,在生产环境上运行迁移脚本。

问题: 主要问题是这样做非常繁琐,因为我是从本地系统执行的,连接到我的生产数据库非常慢,有时我的Visual Studio也会崩溃。是否有更清洁的方法来执行此操作?是否有更自动化的方法,使得我的笔记本电脑不必负责在生产环境中进行数据库迁移?


使用VS的模式比较自动化程序是一个非常聪明的方法,比手动执行创建和删除表命令要好得多。 - kevin
我们做的也是一样的:先建模,然后从模型生成数据库,将 SQL 链接到数据库项目中,再将其与生产数据库进行比较(我们在本地备份上执行以提高速度)。我同意这个过程有点繁琐,我们也在考虑升级到 EF6 等。对我来说,采用 Code First 的替代方案似乎更加繁琐?至少通过数据库比较,可以一次性获取实际差异的脚本,而不是可能会漏掉某些迁移脚本,这可能更容易由一个人完成/修复,但又是另一步骤?一个好问题! - Mark Redman
2个回答

5

1
谢谢,Ladislav。我目前正在使用这个。但这仍然需要我在自己的笔记本电脑上运行脚本。这不是我真正想要的。 - tusharmath
因此,您应该重新考虑使用迁移将项目转换为代码(以及它们的优缺点),因为模型优先并没有提供更好的方法 - 任何方法都将始终导致 SQL 脚本,您必须手动执行或直接将其包含在应用程序中。 - Ladislav Mrnka
3
有人知道EF是否会在未来支持从模型创建的迁移吗? - Mark Redman

3
在模式优先的设计中,我使用 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工具。

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