我一直在使用 Entity Framework 4,使用模型驱动的方法从我的实体生成数据库脚本。这很好,但我不确定在对数据库进行版本控制时它是如何工作的。我猜如果我想使用活动记录类型迁移框架,我必须反过来工作并从我的数据库生成我的实体?有什么方法可以使用模型驱动的方法并正确地对数据库进行版本控制?
5 回答
这将很快作为一个名为 EntityFramework.Migrations 的 NuGet 包推出
Scott Hanselman 在 TechEd 2011 上进行了演示(可在http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/DEV349在线获取)。相关部分为 45 分钟。
简而言之,一旦安装了包,您将在包管理器控制台中输入以下内容以生成数据库更改脚本:
migrate -script
更新(2011 年 11 月 13 日)
这个包的 alpha 3 版本现在可以在 NuGet 上使用。它不使用migrate -script
上面提到的 cmdlet,而是使用 cmdlet Add-Migration <migrationname>
。可以在 ADO.NET 团队博客上找到其使用的演练。
更新(2012 年 2 月 14 日)
此功能现在作为主要EntityFramework NuGet 包的一部分提供,从 4.3 版开始。可以在 ADO.NET 团队博客上找到使用 EF 4.3的更新演练。
你可以试试Wizardby:这是一个管理数据库迁移的工具。它没有与 EF 集成(因为在这方面几乎不可能与它集成),但可以完成工作。
ScottGu 在一篇博文中提到了这点:
我们还将在未来支持 EF 的“迁移”功能,这将允许您以编程方式自动化/编写数据库模式迁移。
[编辑]
我认为他可能指的是Entity Designer Database Generation Power Pack,正如 Morteza Manavi 在另一个 SO 答案中所回答的那样。
好吧,如果你想像 ActiveRecord 一样工作,那么你需要像 ActiveRecord 一样工作。:)
但是,如果您想使用模型优先但仍使用迁移,这将是可能的,但需要代表您进行额外的工作。模型优先将生成一个数据库更改脚本。您必须将相关部分提取到迁移中,以及手动编写撤消脚本。虽然这涉及一些体力劳动,但它并没有让我觉得非常困难。
我正在研究 EF.Migrations 库的替代方案 - EntityFramework.SchemaCompare。它允许将数据库模式与表示数据库上下文的实体模型进行物理比较(EF.Migrations 不这样做)。这可以在数据库初始化期间触发,也可以根据请求手动触发。考虑以下示例
#if DEBUG
Database.SetInitializer(new CheckCompatibilityWithModel<DatabaseContext>());
#endif
如果发现不兼容问题,它将在数据库初始化期间抛出异常,描述数据库模式和模型之间的差异。或者,您可以通过这种方式随时在代码中找到这些差异
using (var ctx = new DatabaseContext())
{
var issues = ctx.Database.FindCompatibilityIssues();
}
然后手头有这些差异/不兼容问题,您可以更新数据库架构或模型。
当您需要完全控制数据库架构和模型设计和/或在多个团队成员处理相同数据库架构和模型的团队中工作时,这种方法特别有用。除了 EF.Migrations 之外,它也可以使用。
在 GitHub 上叉我:https ://github.com/kriasoft/data