dotnet ef migrations add: создавать файл миграции, только если есть изменения - PullRequest
0 голосов
/ 25 апреля 2018

Я использую dotnet ef migrations add {MigrationName} для создания новой миграции.

В случае отсутствия изменений сущностей / контекста создается миграция с пустыми функциями Up(MigrationBuilder migrationBuilder) и Down(MigrationBuilder migrationBuilder).

Есть ли способ для команды migrations add пропустить создание «пустых» файлов?

В качестве альтернативы, есть ли способ определить, есть ли изменения, перед выполнением команды migrations add?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Я нашел решение этой проблемы.

Существует способ создавать миграции программно вместо использования CLI.

После просмотра MigrationsScaffolderИсходный код Мне удалось изменить код в первой ссылке, чтобы удовлетворить мои потребности:

        using (var db = new MyDbContext())
        {
            var reporter = new OperationReporter(
                new OperationReportHandler(
                    m => Console.WriteLine("  error: " + m),
                    m => Console.WriteLine("   warn: " + m),
                    m => Console.WriteLine("   info: " + m),
                    m => Console.WriteLine("verbose: " + m)));

            var designTimeServices = new ServiceCollection()
                .AddSingleton(db.GetService<IHistoryRepository>())
                .AddSingleton(db.GetService<IMigrationsIdGenerator>())
                .AddSingleton(db.GetService<IMigrationsModelDiffer>())
                .AddSingleton(db.GetService<IMigrationsAssembly>())
                .AddSingleton(db.Model)
                .AddSingleton(db.GetService<ICurrentDbContext>())
                .AddSingleton(db.GetService<IDatabaseProvider>())
                .AddSingleton<MigrationsCodeGeneratorDependencies>()
                .AddSingleton<ICSharpHelper, CSharpHelper>()
                .AddSingleton<CSharpMigrationOperationGeneratorDependencies>()
                .AddSingleton<ICSharpMigrationOperationGenerator, CSharpMigrationOperationGenerator>()
                .AddSingleton<CSharpSnapshotGeneratorDependencies>()
                .AddSingleton<ICSharpSnapshotGenerator, CSharpSnapshotGenerator>()
                .AddSingleton<CSharpMigrationsGeneratorDependencies>()
                .AddSingleton<IMigrationsCodeGenerator, CSharpMigrationsGenerator>()
                .AddSingleton<IOperationReporter>(reporter)
                .AddSingleton<MigrationsScaffolderDependencies>()
                .AddSingleton<ISnapshotModelProcessor, SnapshotModelProcessor>()
                .AddSingleton<MigrationsScaffolder>()
                .BuildServiceProvider();

            var scaffolderDependencies = designTimeServices.GetRequiredService<MigrationsScaffolderDependencies>();

            var modelSnapshot = scaffolderDependencies.MigrationsAssembly.ModelSnapshot;
            var lastModel = scaffolderDependencies.SnapshotModelProcessor.Process(modelSnapshot?.Model);
            var upOperations = scaffolderDependencies.MigrationsModelDiffer.GetDifferences(lastModel, scaffolderDependencies.Model);
            var downOperations = upOperations.Any() ? scaffolderDependencies.MigrationsModelDiffer.GetDifferences(scaffolderDependencies.Model, lastModel) : new List<MigrationOperation>();

            if (upOperations.Count() > 0 || downOperations.Count() > 0)
            {
                var scaffolder = designTimeServices.GetRequiredService<MigrationsScaffolder>();

                var migration = scaffolder.ScaffoldMigration(
                    "MyMigration",
                    "MyApp.Data");

                File.WriteAllText(
                    migration.MigrationId + migration.FileExtension,
                    migration.MigrationCode);
                File.WriteAllText(
                    migration.MigrationId + ".Designer" + migration.FileExtension,
                    migration.MetadataCode);
                File.WriteAllText(migration.SnapshotName + migration.FileExtension,
                   migration.SnapshotCode);
            }
        }
0 голосов
/ 25 апреля 2018

Я не знаю, возможно ли это вообще, но пустые миграции также полезны, например, если вы хотите запустить какой-либо скрипт вручную, например, создать / изменить StoredProcedures / Trigger.Для этого вы можете создать пустую миграцию исключительно для определенной цели.

...