From 4c972a48c2f3041d1b398da4c23ae29f0d728da4 Mon Sep 17 00:00:00 2001 From: MaksimChegulov Date: Tue, 12 Oct 2021 17:50:42 +0300 Subject: [PATCH] changed last migration searching logic --- .../Core/MigrationGenerator.cs | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 common/Tools/AutoMigrationCreator/Core/MigrationGenerator.cs diff --git a/common/Tools/AutoMigrationCreator/Core/MigrationGenerator.cs b/common/Tools/AutoMigrationCreator/Core/MigrationGenerator.cs new file mode 100644 index 0000000000..8f9755757c --- /dev/null +++ b/common/Tools/AutoMigrationCreator/Core/MigrationGenerator.cs @@ -0,0 +1,103 @@ +using System; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; + +using ASC.Core.Common.EF; + +using Microsoft.EntityFrameworkCore.Migrations.Design; +using Microsoft.Extensions.DependencyInjection; + +namespace AutoMigrationCreator +{ + public class MigrationGenerator + { + private BaseDbContext _dbContext; + private string _providerName; + private string _assemblyName; + private string _typeName; + private string _contextFolderName; + private Regex _pattern = new Regex(@"\d+$", RegexOptions.Compiled); + private string ContextFolderName + { + get + { + if (_contextFolderName == null) _contextFolderName = _typeName[(_providerName.Length)..] + _providerName; + + return _contextFolderName; + } + } + + public MigrationGenerator(BaseDbContext context) + { + _dbContext = context; + _typeName = _dbContext.GetType().Name; + _assemblyName = _dbContext.GetType().Assembly.GetName().Name; + _providerName = GetProviderName(); + } + + public void Generate() + { + var scaffolder = EFCoreDesignTimeServices.GetServiceProvider(_dbContext) + .GetService(); + + var name = GenerateMigrationName(); + + var migration = scaffolder.ScaffoldMigration(name, + $"{_assemblyName}", $"Migrations.{_providerName}.{ContextFolderName}"); + + SaveMigration(migration); + } + + private void SaveMigration(ScaffoldedMigration migration) + { + var path = Path.GetFullPath(Path.Combine("..", "..", _assemblyName, + "Migrations", _providerName, ContextFolderName)); + + Directory.CreateDirectory(path); + + var migrationPath = Path.Combine(path, $"{migration.MigrationId}{migration.FileExtension}"); + var designerPath = Path.Combine(path, $"{migration.MigrationId}.Designer{migration.FileExtension}"); + var snapshotPath = Path.Combine(path, $"{migration.SnapshotName}{migration.FileExtension}"); + + File.WriteAllText(migrationPath, migration.MigrationCode); + File.WriteAllText(designerPath, migration.MetadataCode); + File.WriteAllText(snapshotPath, migration.SnapshotCode); + } + + private string GetLastMigrationName() + { + var scaffolderDependecies = EFCoreDesignTimeServices.GetServiceProvider(_dbContext) + .GetService(); + + var lastMigration = scaffolderDependecies.MigrationsAssembly.Migrations.LastOrDefault(); + + return lastMigration.Key; + } + + private string GenerateMigrationName() + { + var last = GetLastMigrationName(); + + if (string.IsNullOrEmpty(last)) return ContextFolderName; + + var migrationNumber = _pattern.Match(last).Value; + + if (string.IsNullOrEmpty(migrationNumber)) + return ContextFolderName + "_Upgrade1"; + + return ContextFolderName + "_Upgrade" + (int.Parse(migrationNumber) + 1); + } + + private string GetProviderName() + { + var providers = Enum.GetNames(typeof(Provider)); + var lowerTypeName = _typeName.ToLower(); + var provider = providers.SingleOrDefault(p => lowerTypeName.Contains(p.ToLower())); + + if (provider == null) throw new Exception("Provider not support"); + + return provider; + } + } +}