寻找使用上下文生成 sql 脚本以从一个特定迁移迁移到另一个的代码优先方法。我好像在网上找不到这个。
有点像
context.Database.GenerateMigrationScript(‘migration5’ , ‘migration7’)
返回一串sql脚本
谢谢!
IMigrator
) 基础设施以编程方式生成迁移。要访问它,您可以使用AccessorExtensions.GetService<TService>
方法:
MyAppDbContext ctx = ...
var migrator = ctx.GetService<IMigrator>();
var generateScript = migrator.GenerateScript(‘migration5’ , ‘migration7’);
附言
您也可以使用
dotnet ef
CLI 工具,它有 dotnet ef migrations script
命令(也接受 from 和 to 参数):
从迁移生成 SQL 脚本。
不幸的是,Entity Framework Core 没有提供直接的方法来在开箱即用的特定迁移之间生成 SQL 脚本。但是,您可以通过使用 IMigrator 服务和一些自定义代码来实现这一点。这是您如何执行此操作的示例:
首先,在您的 DbContext 派生类中创建一个自定义方法:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using System.Linq;
public class YourDbContext : DbContext
{
// Your DbContext implementation here...
public string GenerateMigrationScript(string fromMigration, string toMigration)
{
var migrator = this.GetService<IMigrator>() as Migrator;
var migrations = this.GetService<IMigrationsAssembly>();
var migrationSqlGenerator = this.GetService<IMigrationsSqlGenerator>();
var migrationBuilder = new MigrationBuilder(this.Database.ProviderName);
var appliedMigrations = this.Database.GetAppliedMigrations();
var targetMigrations = migrations.Migrations
.Where(m => string.Compare(m.Key, fromMigration, StringComparison.OrdinalIgnoreCase) > 0
&& string.Compare(m.Key, toMigration, StringComparison.OrdinalIgnoreCase) <= 0)
.OrderBy(m => m.Key)
.ToList();
foreach (var migration in targetMigrations)
{
if (appliedMigrations.Contains(migration.Key)) // Downgrade
{
migrationBuilder.Clear();
migration.Value.Down(migrationBuilder);
var operations = migrationBuilder.Operations.ToArray();
var commands = migrationSqlGenerator.Generate(operations, this.Database.ProviderName);
foreach (var command in commands)
{
Console.WriteLine(command.CommandText);
}
}
else // Upgrade
{
migrationBuilder.Clear();
migration.Value.Up(migrationBuilder);
var operations = migrationBuilder.Operations.ToArray();
var commands = migrationSqlGenerator.Generate(operations, this.Database.ProviderName);
foreach (var command in commands)
{
Console.WriteLine(command.CommandText);
}
}
}
return string.Join(Environment.NewLine, migrationBuilder.GetCommands());
}
}
在代码中使用自定义方法:
using (var context = new YourDbContext())
{
string sqlScript = context.GenerateMigrationScript("migration5", "migration7");
Console.WriteLine(sqlScript);
}
此代码片段创建了一个名为 GenerateMigrationScript 的自定义方法,它将开始和结束迁移的名称作为输入。该方法检索 IMigrator 服务并使用它为指定范围的迁移生成 SQL 脚本。然后将生成的脚本作为字符串返回。
请注意,此代码是作为起点提供的,您可能需要对其进行调整以满足您的特定要求。