move to directories

This commit is contained in:
Maksim Chegulov 2021-10-12 17:45:12 +03:00
parent 8a782a9993
commit 1a7021d6c4
6 changed files with 0 additions and 288 deletions

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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");
}
}
}

View File

@ -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);
}
}
}

View File

@ -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>();
}
}
}