8

我正在玩实体框架和持续构建。到目前为止,通过使用 migrate.exe 和适当的参数,我可以毫无问题地运行迁移或一系列迁移。

但是,当我尝试让 migrate.exe 踢出脚本而不是执行迁移时,我遇到了麻烦,就像我可以通过运行得到的一样

update-database -TargetMigration TestMigration -script

从 Visual Studio 的包管理器控制台中。

目前有没有办法做到这一点?

谢谢。

4

4 回答 4

6

自 2017 年 10 月 22 日以来,您可以通过此 PR 做到这一点: https ://github.com/aspnet/EntityFramework6/commit/02ec6b8c9279f93f80eeed1234e5ce0acfce5f31

这里是实现此功能的实体框架 6.2 发行说明(请参阅“Migrate.exe 应支持 -script 选项”部分): https ://blogs.msdn.microsoft.com/dotnet/2017/10/26/entity-framework- 6-2-运行时发布/

请按照以下步骤操作:

  1. 在部署包含新迁移的新程序集之后,将文件 migrate.exe 从“\packages\EntityFramework.6.2.0\tools”复制到目标“bin”文件夹(例如在生产服务器上)
  2. 在文件夹中打开命令行并启动以下命令:

migrate.exe yourMigrationAssembly.dll /startupConfigurationFile=”..\web.config” /scriptFile="migrationOutput.sql"

它将根据尚未应用的迁移生成文件“migrationOutput.sql”,其中包含您必须在目标环境数据库上执行的 SQL。

于 2018-03-07T15:03:48.353 回答
5

目前不支持。请为该问题投票:迁移:-Script for Migrate.exe

于 2012-08-08T17:54:19.147 回答
3

我遇到了同样的问题,并且确实在Visual Studio的包管理器控制台中提供了该选项。因此,我打开了 powershell 脚本和实体框架 dll 并构建了一个小型可执行文件,以便您可以从命令行生成脚本。源代码按原样提供,此处不提供任何保证;

于 2013-10-23T18:44:13.463 回答
3

您可以编写一个简单的 c# 控制台应用程序或使用 Linqpad 之类的东西来使用 Entity Framework Infrastructure 对象生成脚本。您只需要使用 DbMigrationsConfiguration 类加载 DLL 并实例化它。这是类似于对我有用的代码:

using System.Data.Entity.Infrastructure;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;

const string ScriptFile = "Migration.sql";
const string ConnectionString = @"Server=.\SqlExpress;Database=...;Trusted_Connection=True;";
const bool AutomaticMigrationDataLossAllowed = false;

var targetDb = new DbConnectionInfo(ConnectionString, "System.Data.SqlClient");
var config = new MyDbMigrationsConfiguration
{
    AutomaticMigrationDataLossAllowed = AutomaticMigrationDataLossAllowed,
    TargetDatabase = targetDb,
};

var migrator = new DbMigrator(config);
var scripter = new MigratorScriptingDecorator(migrator);
var script = scripter.ScriptUpdate(null, null);

File.WriteAllText(ScriptFile, script);
Console.WriteLine("Migration Script Generated: " + ScriptFile);
于 2015-12-01T18:36:07.100 回答