大约4个月前我也遇到了同样的问题。我们正在考虑使用EF,唯一无法解决的问题是在使用“代码优先”方法时进行数据库迁移。
从代码创建新的数据库很容易,但如果您已经有一个从代码创建的数据库,现在又向其中一个类添加了一个新属性,或者更糟糕的是,更改了其类型或名称,该怎么办呢?我寻找了这个问题的解决方案很长时间,但没有找到任何东西。从问题的本质来看,我怀疑不会很快有解决方案。EF需要能够“记住”创建原始DB模式的代码,然后在原始代码和当前代码之间自动执行“差异”,最后分析更改并以不破坏存储数据的方式将其实现在DB模式中...它需要能够处理可能的重构、类重命名等。我怀疑这不会很快成为一个功能...
目前我使用了几个工具进行迁移,包括 EF 模型和通过 NORMA 工具生成的模式。我主要使用 ApexSQL Diff 工具,然后通过他们的 ApexSQL Edit 工具运行生成的脚本。使用 Diff 工具,我将从模型创建的数据库与“当前”数据库进行比较以创建更改脚本。我使用后者是因为它会将执行分成批次,并单独显示每个批次的错误(如果有错误)。
另外,我一直在使用 ApexSQL Data Diff 工具来编写基础数据(如查找表)的更改脚本。
我一直对Visual Studio 2010和SQL Server 2008 R2的数据层应用程序功能感到着迷。它似乎将要创建的数据库的元数据描述存储起来,因此当您重新部署DAC包时,它会比较元数据以查看是否有更改。然后,它仅更改实际需要更改的数据库部分。这应该允许使用单个部署包升级不同版本级别的数据库,而无需单独为每个版本编写升级脚本。尽管如此,我还没有使用过它,并且我相信它仅限于SQL Server 2008 R2。
这个工具不是免费的,但有30天的免费试用期:它可以解决EF4设计器中的许多缺陷(通过生成SQL-DDL增量更改脚本),以及其他问题。以下是该工具的链接:
http://huagati.com/edmxtools/
介绍视频:
http://huagati.blogspot.com/2010/07/introducing-model-comparer-for-entity.html