【问题标题】:Scripting EF Add-Migration into an automated build task将 EF Add-Migration 脚本编写到自动构建任务中
【发布时间】:2013-12-18 14:37:58
【问题描述】:

我将所有 ef 代码首先迁移到一个名为 Migrations 的单独程序集中

在包管理器控制台中,我输入Add-Migration xyz,它会构建迁移

是否可以从 Visual Studio 外部执行此操作?我正在使用 rake 脚本为我的构建进行大量自动化,但这是我还没有完全掌握的一部分。这里的目标是执行以下操作

rake db:add_migration "xyz"

这将运行一些命令并将迁移添加到指定的项目。这是我唯一无法弄清楚如何自动化的地方!我可能会构建其他任务,例如删除和创建数据库以及将迁移导出到脚本,以便它可以在我的回旋迁移下运行。

相关资料

Add-Migration [-Name] <String> [-Force]
[-ProjectName <String>] [-StartUpProjectName <String>]
[-ConfigurationTypeName <String>] [-ConnectionStringName <String>]
[-IgnoreChanges] [<CommonParameters>]

Command Reference

我可以看到 EF 是从 nuget 安装到 packages 文件夹的

packages\EntityFramework.5.0.0\tools

我可以在文件中看到EntityFramework.psm1

function Add-Migration
{
    [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')]
    param (
        [parameter(Position = 0,
....
}

但我不确定如何从命令行执行它。我试过了

..\packages\EntityFramework.5.0.0\tools>powershell EntityFramework.psm1 Add-Migration

但这会导致错误

The term 'EntityFramework.psm1' is not recognized as the name of a cmdlet, 
function, script file, or operable program. Check the spelling of the name, 
or if a path was included, verify that the path is correct and try again.
At line:1 char:21
    + EntityFramework.psm1 <<<<  Add-Migration
    + CategoryInfo          : ObjectNotFound: (EntityFramework.psm1:String) [],
                              CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

【问题讨论】:

  • 为什么不直接使用自动迁移?
  • 如果你这样做,就没有审计线索。
  • 嗯...如果您想要审计跟踪,您可以随时查看 __MigrationHistory 表。
  • 我将迁移导出到 SQL 文件,因为我想要可追溯性。我从RoundHouse 运行迁移,因为它比migrate.exe 功能更全面
  • 您可以使用已安装的 Nuget 包中提供的 migrate.exe。查看用法:msdn.microsoft.com/en-us/library/jj618307(v=vs.113).aspx

标签: entity-framework entity-framework-5 build-automation entity-framework-migrations


【解决方案1】:

查看EntityFramework.psm1,它只是 EntityFramework.PowerShell.dll 的脚本外观。实际的添加迁移功能在该程序集中的 System.Data.Entity.Migrations.AddMigrationCommand 类中实现。

查看源代码,它通过这一行获取当前活动的项目(我假设这是在 powershell 控制台中选择的项目):

get { return (Project)_domain.GetData("project"); }

ProjectEnvDTE.Project(如果我正确地用谷歌搜索的话)是与 IDE 交互的一种方式。一些进一步的源代码阅读表明,文件是通过与 IDE 接口添加到项目中的。

在我看来,脚手架代码与 Visual Studio 的集成度太高,无法作为命令行构建的一部分在 Visual Studio 之外运行。

编辑

我正在回到这个问题上,并发现这是可能的。还有另一个 SO question 描述了如何在 Visual Studio 之外使用 EnvDTE,例如从命令行应用程序:

Open DTE solution from another program (not add-in)

因此,如果在调用 AddMigrationCommand 类之前使用适当的 EnvDTE 对象准备应用程序域,则确实可以围绕 EntityFramework.PowerShell.dll 编写自己的 .exe 包装器。为此,您必须分析 Entity Framework 源代码以了解如何欺骗脚手架代码以相信它在 Visual Studio 中运行。

所以,最后:这可能是可能的 - 但为它编写自己的工具将是一个不平凡的项目。

【讨论】:

  • @Neil:仔细研究了一下。我认为我错了——这可能是有可能的(虽然不是微不足道的)。
  • 太好了,我会做一个小控制台应用程序,看看我是否可以让 Dlls 中的功能发挥作用。
  • 今天下午我快速拍摄了一张照片,但目前看起来确实有点超出我的想象。我肯定给了一周左右的时间,我可以糊弄过去,但不幸的是,这似乎不是一个很好的利用时间。不过感谢您的帮助。
【解决方案2】:

EF Powershell 命令必须在 Visual Studio 中运行才能正常工作。在命令行中,您可以使用migrate.exe,但它不支持添加新的迁移。

【讨论】:

  • 你确定吗?有任何链接或参考来支持这个吗?
  • 我们的 codeplex 网站上确实有一些项目跟踪我们 migrate.exe 体验的总体改进。如果您有兴趣从命令行生成迁移,请随时加入对话。 (例如:entityframework.codeplex.com/workitem/315
  • 另外,根据 Anders Abel 的上述回答,可以包装/模拟 VS DTE API,但我们从未尝试过。如果你得到它的工作,写下你是如何做到的,让我们知道!
  • 很高兴知道,我可能会提出功能请求。下周我会看看我如何继续使用控制台应用程序。不过,我必须开一个博客来写它。我喜欢 EF,但它可能更容易集成到自动化构建和部署中
【解决方案3】:

我遇到了类似的问题(自动添加迁移)并想出了here 所示的解决方案。

您可以创建一个控制台应用程序,该应用程序打开一个无头 Visual Studio 实例以获取项目参考。通过项目参考,您可以直接调用 EntityFramework 代码(而不是通过 Powershell)来触发迁移并取回代码。

获得代码后,您可以将其发送到您想要的任何位置(例如发送到添加到项目中的文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2017-11-23
    相关资源
    最近更新 更多