如何通过用户定义的代码为实体框架使用迁移命令

Posted

技术标签:

【中文标题】如何通过用户定义的代码为实体框架使用迁移命令【英文标题】:How to use Migration Commands for Entity Framework through User Defined Code 【发布时间】:2013-03-25 16:44:27 【问题描述】:

我需要能够执行包管理器控制台为代码优先数据库迁移执行的所有可用功能。有谁知道我如何严格通过用户定义的代码来完成这些命令?我正在尝试自动化整个迁移过程,我的团队遇到了由于该项目的开发人员数量众多而导致迁移不同步的可怕问题。我想编写一个开发人员可以与之交互的项目,该项目将创建并在需要时自动为他们重新构建迁移。

【问题讨论】:

【参考方案1】:

PM 正在通过 PowerShell 和 PS cmdlet 调用(例如用于活动目录等)http://docs.nuget.org/docs/reference/package-manager-console-powershell-reference

包管理器控制台是 Visual 中的 PowerShell 控制台 工作室

...关于这个的信息基本上很少 - 我之前已经尝试过几次,如果你真的需要它,它会归结为做一些“肮脏的工作”(不是真的当然,这可能并不难——只要你有一些 PS 经验)

这里有类似的问题/答案 - 制定 PS comdlet 非常复杂 - 在这种情况下,它涉及一些额外的步骤。而且 PS 往往非常依赖于版本 - 所以你需要检查你正在使用的特定 EF/CF。

Run entityframework cmdlets from my code

Possible to add migration using EF DbMigrator

您可能想查看Add-Migration EF 的源代码更正:这是官方存储库的链接 - 感谢@Brice)

http://entityframework.codeplex.com/SourceControl/changeset/view/f986cb32d0a3#src/EntityFramework.PowerShell/Migrations/AddMigrationCommand.cs

http://entityframework.codeplex.com/SourceControl/BrowseLatest

(PM 错误还表明执行 Add-Migrations 的代码的起源是 'System.Data.Entity.Migrations.Design.ToolingFacade')

如果您需要“只是”Update - 您可以尝试使用 DbMigrator.Update(这家伙试了一下 http://joshmouch.wordpress.com/2012/04/22/entity-framework-code-first-migrations-executing-migrations-using-code-not-powershell-commands/) - 但我不确定是否相关对你来说,我对此表示怀疑。脚手架是真正的问题(Add-Migration),据我所知,无法通过 EF/CF 框架直接从 C# 访问它。


注意:-基于 (http://entityframework.codeplex.com/SourceControl/changeset/view/f986cb32d0a3#src/EntityFramework.PowerShell/Migrations/AddMigrationCommand.cs) 中的代码-正如 EF 大师自己提到的那样-这部分代码正在调用 System.Data.Entity.Migrations.Design 库-它完成了大部分工作。 如果可以引用那个并实际重复 AddMigrationCommand 正在做的事情 - 那么可能根本不需要 PowerShell。但我怀疑这不是那么直截了当,可能的“内部”呼叫对外部呼叫者等是不可见的。

【讨论】:

为什么要链接到实体框架的 Mono 分支?官方仓库在这里:entityframework.codeplex.com/SourceControl/BrowseLatest 显然是因为我找不到它 :) 谢谢你 - 我已经打开了原始链接,我只是快速检查了 - 我提到它很可疑 - 我会编辑它跨度> @Brice - 实际上我查看了那个但我有一个错误的链接 - 现在应该没问题。我对这篇文章的想法是尝试在一个地方收集有关此问题的所有信息 - 其他地方很少,也没有确认是否有人真正尝试过。因此,请随意跳入并编辑 - 如果要添加某些内容,请添加 cmets。欢呼【参考方案2】:

至少在这篇文章中,您可以直接访问System.Data.Entity.Migrations.Design.MigrationScaffolder 类并直接调用其上的Scaffold() 方法,这将返回一个包含“常规”.cs 文件内容的对象,即“Designer.cs”文件和 .resx 文件。

您如何处理这些文件取决于您!

就我个人而言,我正在尝试将其变成一个工具,以便能够在 powershell 命令不支持的新 ASPNET5/DNX 项目上创建 EF6 迁移。

【讨论】:

以上是关于如何通过用户定义的代码为实体框架使用迁移命令的主要内容,如果未能解决你的问题,请参考以下文章

在不使用其他项目的情况下添加实体框架核心迁移

必需的属性,但可以为空,通过代码优先的实体框架

实体框架代码迁移 - 卡在初始迁移上

实体框架代码优先:启用迁移错误

实体框架 - 迁移 - 代码优先 - 每次迁移播种

独立于模式的实体框架代码优先迁移