EF core 有没有办法使用 dbContext 生成迁移脚本

问题描述 投票:0回答:2

寻找使用上下文生成 sql 脚本以从一个特定迁移迁移到另一个的代码优先方法。我好像在网上找不到这个。

有点像

context.Database.GenerateMigrationScript(‘migration5’ , ‘migration7’) 

返回一串sql脚本

谢谢!

c# entity-framework-core ef-code-first npgsql .net-7.0
2个回答
2
投票

您可以使用 EF Core 迁移器 (

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 脚本。


0
投票

不幸的是,Entity Framework Core 没有提供直接的方法来在开箱即用的特定迁移之间生成 SQL 脚本。但是,您可以通过使用 IMigrator 服务和一些自定义代码来实现这一点。这是您如何执行此操作的示例:

  1. 首先,在您的 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());
        }
    }
    
  2. 在代码中使用自定义方法:

    using (var context = new YourDbContext())
    {
        string sqlScript = context.GenerateMigrationScript("migration5", "migration7");
        Console.WriteLine(sqlScript);
    }
    

此代码片段创建了一个名为 GenerateMigrationScript 的自定义方法,它将开始和结束迁移的名称作为输入。该方法检索 IMigrator 服务并使用它为指定范围的迁移生成 SQL 脚本。然后将生成的脚本作为字符串返回。

请注意,此代码是作为起点提供的,您可能需要对其进行调整以满足您的特定要求。

© www.soinside.com 2019 - 2024. All rights reserved.