changed last migration searching logic
This commit is contained in:
parent
9db8371344
commit
4c972a48c2
103
common/Tools/AutoMigrationCreator/Core/MigrationGenerator.cs
Normal file
103
common/Tools/AutoMigrationCreator/Core/MigrationGenerator.cs
Normal file
@ -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<IMigrationsScaffolder>();
|
||||
|
||||
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<MigrationsScaffolderDependencies>();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user