elsa-core/src/modules/Elsa.EntityFrameworkCore.Common/DbSchemaAwareMigrationAssembly.cs
jdevillard e518ec60c1
Features : Allow Customization of DbContext Schema (#4638)
* Implement Changing DB Migration Schema At Runtime

* Add Schema Customization for SQL Server Provider

* Add Schema Customization for PostreSql  Provider

* Add Schema Customization for MySql  Provider

---------

Co-authored-by: Jérémie DEVILLARD <jdevillard@users.noreply.github.com>
2023-11-19 10:22:13 +01:00

44 lines
1.6 KiB
C#

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations.Internal;
using Microsoft.EntityFrameworkCore.Migrations;
using System.Reflection;
using Elsa.EntityFrameworkCore.Common.Contracts;
namespace Elsa.EntityFrameworkCore.Common;
/// <summary>
/// Class That enable Schema change for Migration
/// </summary>
public class DbSchemaAwareMigrationAssembly : MigrationsAssembly
{
private readonly DbContext _context;
public DbSchemaAwareMigrationAssembly(ICurrentDbContext currentContext,
IDbContextOptions options, IMigrationsIdGenerator idGenerator,
IDiagnosticsLogger<DbLoggerCategory.Migrations> logger)
: base(currentContext, options, idGenerator, logger)
{
_context = currentContext.Context;
}
public override Migration CreateMigration(TypeInfo migrationClass,
string activeProvider)
{
if (activeProvider == null)
throw new ArgumentNullException(nameof(activeProvider));
var hasCtorWithSchema = migrationClass
.GetConstructor(new[] { typeof(IElsaDbContextSchema) }) != null;
if (hasCtorWithSchema && _context is IElsaDbContextSchema schema)
{
var instance = (Migration)Activator.CreateInstance(migrationClass.AsType(), schema);
instance.ActiveProvider = activeProvider;
return instance;
}
return base.CreateMigration(migrationClass, activeProvider);
}
}