move to directories
This commit is contained in:
parent
8a782a9993
commit
1a7021d6c4
@ -1,70 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
using ASC.Core.Common.EF;
|
||||
|
||||
namespace AutoMigrationCreator
|
||||
{
|
||||
public class ContextFinder
|
||||
{
|
||||
public Settings Settings { get; }
|
||||
private readonly Type _baseType = typeof(BaseDbContext);
|
||||
private readonly string _assemblyName = "ASC.Core.Common";
|
||||
|
||||
public ContextFinder(Settings settings)
|
||||
{
|
||||
Settings = settings;
|
||||
}
|
||||
|
||||
public IEnumerable<Type> GetContextsTypes()
|
||||
{
|
||||
var coreContextAssembly = Assembly.Load(_assemblyName);
|
||||
var assemblyTypes = coreContextAssembly.GetTypes();
|
||||
|
||||
var independetProviderTypes = GetProviderIndependentContextTypes(assemblyTypes);
|
||||
var dependetProviderTypes = GetProviderDependetContextTypes(assemblyTypes, independetProviderTypes);
|
||||
|
||||
foreach (var contextType in dependetProviderTypes)
|
||||
{
|
||||
yield return contextType;
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerable<Type> GetProviderIndependentContextTypes(IEnumerable<Type> assemblyTypes)
|
||||
{
|
||||
return assemblyTypes.Where(b => b.BaseType == _baseType);
|
||||
}
|
||||
|
||||
private IEnumerable<Type> GetProviderDependetContextTypes(IEnumerable<Type> assemblyTypes,
|
||||
IEnumerable<Type> indepentedTypes)
|
||||
{
|
||||
var provider = GetProviderName();
|
||||
|
||||
foreach (var assemblyType in assemblyTypes)
|
||||
{
|
||||
foreach (var independtType in indepentedTypes)
|
||||
{
|
||||
if (IsNeededContext(assemblyType, independtType, provider)) yield return assemblyType;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string GetProviderName()
|
||||
{
|
||||
using var templateContext = new CoreDbContext();
|
||||
templateContext.ConnectionStringSettings = Settings.ConnectionStringSettings;
|
||||
|
||||
return templateContext.GetProviderByConnectionString().ToString().ToLower();
|
||||
}
|
||||
|
||||
private bool IsNeededContext(Type inheritedСontext, Type baseContext, string providerName)
|
||||
{
|
||||
if (inheritedСontext.BaseType == baseContext
|
||||
&& inheritedСontext.Name.ToLower().Contains(providerName)) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
using System;
|
||||
using System.Configuration;
|
||||
|
||||
using ASC.Core.Common.EF;
|
||||
|
||||
namespace AutoMigrationCreator
|
||||
{
|
||||
public class DbContextActivator
|
||||
{
|
||||
public static BaseDbContext CreateInstance(Type contextType, ConnectionStringSettings connectionSettings)
|
||||
{
|
||||
var context = (BaseDbContext)Activator.CreateInstance(contextType);
|
||||
context.ConnectionStringSettings = connectionSettings;
|
||||
|
||||
return context;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
|
||||
using ASC.Core.Common.EF;
|
||||
|
||||
using Microsoft.EntityFrameworkCore.Design;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace AutoMigrationCreator
|
||||
{
|
||||
public static class EFCoreDesignTimeServices
|
||||
{
|
||||
public static ServiceProvider GetServiceProvider(BaseDbContext context)
|
||||
{
|
||||
var serviceCollection = new ServiceCollection();
|
||||
serviceCollection.AddEntityFrameworkDesignTimeServices();
|
||||
serviceCollection.AddDbContextDesignTimeServices(context);
|
||||
|
||||
var designTimeServices = serviceCollection.BuildServiceProvider();
|
||||
|
||||
return designTimeServices;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace AutoMigrationCreator
|
||||
{
|
||||
public class MigrationCreator
|
||||
{
|
||||
public static void Run(Settings settings)
|
||||
{
|
||||
var counter = 0;
|
||||
var ctxTypesFinder = new ContextFinder(settings);
|
||||
|
||||
foreach (var contextType in ctxTypesFinder.GetContextsTypes())
|
||||
{
|
||||
var context = DbContextActivator.CreateInstance(contextType, settings.ConnectionStringSettings);
|
||||
|
||||
var modelDiffChecker = new ModelDifferenceChecker(context);
|
||||
|
||||
if (!modelDiffChecker.IsDifferent()) continue;
|
||||
|
||||
context = DbContextActivator.CreateInstance(contextType, settings.ConnectionStringSettings); //Hack: refresh context
|
||||
|
||||
var migrationGenerator = new MigrationGenerator(context);
|
||||
migrationGenerator.Generate();
|
||||
|
||||
counter++;
|
||||
}
|
||||
|
||||
Console.WriteLine($"Created {counter} migrations");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,95 +0,0 @@
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
using ASC.Core.Common.EF;
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
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;
|
||||
_providerName = _dbContext.GetProviderByConnectionString().ToString();
|
||||
_assemblyName = _dbContext.GetType().Assembly.GetName().Name;
|
||||
}
|
||||
|
||||
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 migrations = _dbContext.Database.GetPendingMigrations();
|
||||
|
||||
if (!migrations.Any()) migrations = _dbContext.Database.GetAppliedMigrations();
|
||||
|
||||
if (!migrations.Any()) return string.Empty;
|
||||
|
||||
var lastMigration = migrations.Last();
|
||||
|
||||
return lastMigration;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
using ASC.Core.Common.EF;
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Migrations.Design;
|
||||
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace AutoMigrationCreator
|
||||
{
|
||||
public class ModelDifferenceChecker
|
||||
{
|
||||
private BaseDbContext _dbContext;
|
||||
public ModelDifferenceChecker(BaseDbContext context)
|
||||
{
|
||||
_dbContext = context;
|
||||
}
|
||||
|
||||
public bool IsDifferent()
|
||||
{
|
||||
var scaffolderDependecies = GetScaffolderDependencies();
|
||||
|
||||
var modelSnapshot = scaffolderDependecies.MigrationsAssembly.ModelSnapshot;
|
||||
|
||||
if (modelSnapshot == null) return true;
|
||||
|
||||
var lastModel = scaffolderDependecies.SnapshotModelProcessor.Process(modelSnapshot.Model)
|
||||
.GetRelationalModel();
|
||||
|
||||
if (modelSnapshot == null) return true;
|
||||
|
||||
var upMethodOperations = scaffolderDependecies.MigrationsModelDiffer.GetDifferences(
|
||||
lastModel, scaffolderDependecies.Model.GetRelationalModel());
|
||||
|
||||
var downMethodOperations = upMethodOperations.Count != 0 ?
|
||||
scaffolderDependecies.MigrationsModelDiffer.GetDifferences(
|
||||
scaffolderDependecies.Model.GetRelationalModel(), lastModel)
|
||||
: new List<MigrationOperation>();
|
||||
|
||||
if (upMethodOperations.Count > 0 || downMethodOperations.Count > 0) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private MigrationsScaffolderDependencies GetScaffolderDependencies()
|
||||
{
|
||||
return EFCoreDesignTimeServices.GetServiceProvider(_dbContext)
|
||||
.GetService<MigrationsScaffolderDependencies>();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user