using System; using System.Data.Common; using System.Threading; using System.Threading.Tasks; using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities; using EntityFrameworkCore.Jet.Infrastructure; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.EntityFrameworkCore.Metadata.Conventions; using Microsoft.Extensions.DependencyInjection; namespace EntityFrameworkCore.Jet { public class ContextBase : DbContext { private IServiceProvider _serviceProvider; private string _databaseName; private Action _commandLogger; private Action _model; private Action _options; private Action _jetOptions; public void Initialize( string databaseName, Action commandLogger, Action model = null, Action options = null, IServiceCollection serviceCollection = null, Action jetOptions = null) { _serviceProvider = (serviceCollection ?? new ServiceCollection().AddEntityFrameworkJet()) .BuildServiceProvider(); _databaseName = databaseName; _commandLogger = commandLogger; _model = model; _options = options; _jetOptions = jetOptions; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder .UseJet(_databaseName, TestEnvironment.DataAccessProviderFactory, b => { b.ApplyConfiguration(); _jetOptions?.Invoke(b); }) .AddInterceptors(new CommandInterceptor(_commandLogger)) .UseInternalServiceProvider(_serviceProvider); if (_model != null) { var conventionSet = JetConventionSetBuilder.Build(); var modelBuilder = new ModelBuilder(conventionSet); _model.Invoke(modelBuilder); var model = modelBuilder.FinalizeModel(); optionsBuilder.UseModel(model); } _options?.Invoke(_serviceProvider, optionsBuilder); } private class CommandInterceptor : DbCommandInterceptor { private readonly Action _commandLogger; public CommandInterceptor(Action commandLogger) { _commandLogger = commandLogger; } public override InterceptionResult ReaderExecuting(DbCommand command, CommandEventData eventData, InterceptionResult result) { _commandLogger.Invoke(command); return base.ReaderExecuting(command, eventData, result); } public override InterceptionResult ScalarExecuting(DbCommand command, CommandEventData eventData, InterceptionResult result) { _commandLogger.Invoke(command); return base.ScalarExecuting(command, eventData, result); } public override InterceptionResult NonQueryExecuting(DbCommand command, CommandEventData eventData, InterceptionResult result) { _commandLogger.Invoke(command); return base.NonQueryExecuting(command, eventData, result); } public override ValueTask> ReaderExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult result, CancellationToken cancellationToken = new CancellationToken()) { _commandLogger.Invoke(command); return base.ReaderExecutingAsync(command, eventData, result, cancellationToken); } public override ValueTask> ScalarExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult result, CancellationToken cancellationToken = new CancellationToken()) { _commandLogger.Invoke(command); return base.ScalarExecutingAsync(command, eventData, result, cancellationToken); } public override ValueTask> NonQueryExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult result, CancellationToken cancellationToken = new CancellationToken()) { _commandLogger.Invoke(command); return base.NonQueryExecutingAsync(command, eventData, result, cancellationToken); } } } }