【发布时间】:2011-03-21 15:11:58
【问题描述】:
我使用 codefirst 并发布了我的应用程序的 1.0 版。
现在我改变了一堆表的东西,我想用 2.0 升级我的应用程序的 1.0 db。
这种情况在实体框架中通常是如何处理的?
【问题讨论】:
标签: .net sql entity-framework linq-to-entities
我使用 codefirst 并发布了我的应用程序的 1.0 版。
现在我改变了一堆表的东西,我想用 2.0 升级我的应用程序的 1.0 db。
这种情况在实体框架中通常是如何处理的?
【问题讨论】:
标签: .net sql entity-framework linq-to-entities
EF [还没有] 内置任何用于生成差异脚本的功能。 EF 可以删除并重新创建数据库,但这在现实世界中并不真正可用... ...他们似乎有数据库迁移计划,但我不知道何时/是否可用(http://blogs.msdn.com/b/efdesign/archive/2010/10/22/code-first-database-evolution-aka-migrations.aspx) .
如果您想进行增量更改(添加/删除表、列、约束、索引等),您将必须编写 SQL 脚本来应用从版本 1 数据库到版本 2 数据库所需的更改。将数据库“版本号”存储在数据库中的某个位置是一个好主意,这样当您“在野外”有许多不同的版本用完时,可以更轻松地应用正确的脚本。
或者,有 3rd 方工具可以基于 EDMX/db 差异生成增量差异脚本(“alter table ...”等),例如我的 EF4 的“模型比较器”:http://huagati.blogspot.com/2010/07/introducing-model-comparer-for-entity.html
【讨论】:
我们使用的一种替代方法是保留两个实体框架模型,一个带有旧的,一个带有新的。在反射的帮助下,您可以创建最适合的迁移算法。
旧的 EF 模型可以序列化为 XML 或任何此类格式。然后您可以删除并重新创建数据库并从 XML 反序列化您的 EF 模型并将它们放回新数据库中。然而,插入身份似乎没什么问题,但可以管理。
但此解决方案仅适用于小型数据库,对于大型数据库,您将需要更高级的解决方案。
【讨论】: