diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs index bc62473bd2..b1b84f7236 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContextOptions.cs @@ -7,15 +7,28 @@ namespace Volo.Abp.EntityFrameworkCore { public class AbpDbContextOptions { + internal List> DefaultPreConfigureActions { get; set; } + internal Action DefaultConfigureAction { get; set; } + internal Dictionary> PreConfigureActions { get; set; } + internal Dictionary ConfigureActions { get; set; } public AbpDbContextOptions() { + DefaultPreConfigureActions = new List>(); + PreConfigureActions = new Dictionary>(); ConfigureActions = new Dictionary(); } + public void PreConfigure([NotNull] Action action) + { + Check.NotNull(action, nameof(action)); + + DefaultPreConfigureActions.Add(action); + } + public void Configure([NotNull] Action action) { Check.NotNull(action, nameof(action)); @@ -23,6 +36,20 @@ namespace Volo.Abp.EntityFrameworkCore DefaultConfigureAction = action; } + public void PreConfigure([NotNull] Action> action) + where TDbContext : AbpDbContext + { + Check.NotNull(action, nameof(action)); + + var actions = PreConfigureActions.GetOrDefault(typeof(TDbContext)); + if (actions == null) + { + PreConfigureActions[typeof(TDbContext)] = actions = new List(); + } + + actions.Add(action); + } + public void Configure([NotNull] Action> action) where TDbContext : AbpDbContext { diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs index f51bd45de8..00b73ff910 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs @@ -21,23 +21,53 @@ namespace Volo.Abp.EntityFrameworkCore.DependencyInjection creationContext.ExistingConnection ); - var dbContextOptions = GetDbContextOptions(serviceProvider); + var options = GetDbContextOptions(serviceProvider); - var configureAction = dbContextOptions.ConfigureActions.GetOrDefault(typeof(TDbContext)); + PreConfigure(options, context); + Configure(options, context); + + return context.DbContextOptions.Options; + } + + private static void PreConfigure( + AbpDbContextOptions options, + AbpDbContextConfigurationContext context) + where TDbContext : AbpDbContext + { + foreach (var defaultPreConfigureAction in options.DefaultPreConfigureActions) + { + defaultPreConfigureAction.Invoke(context); + } + + var preConfigureActions = options.PreConfigureActions.GetOrDefault(typeof(TDbContext)); + if (!preConfigureActions.IsNullOrEmpty()) + { + foreach (var preConfigureAction in preConfigureActions) + { + ((Action>)preConfigureAction).Invoke(context); + } + } + } + + private static void Configure( + AbpDbContextOptions options, + AbpDbContextConfigurationContext context) + where TDbContext : AbpDbContext + { + var configureAction = options.ConfigureActions.GetOrDefault(typeof(TDbContext)); if (configureAction != null) { ((Action>)configureAction).Invoke(context); } - else if (dbContextOptions.DefaultConfigureAction != null) + else if (options.DefaultConfigureAction != null) { - dbContextOptions.DefaultConfigureAction.Invoke(context); + options.DefaultConfigureAction.Invoke(context); } else { - throw new AbpException($"No configuration found for {typeof(DbContext).AssemblyQualifiedName}! Use services.Configure(...) to configure it."); + throw new AbpException( + $"No configuration found for {typeof(DbContext).AssemblyQualifiedName}! Use services.Configure(...) to configure it."); } - - return context.DbContextOptions.Options; } private static AbpDbContextOptions GetDbContextOptions(IServiceProvider serviceProvider)