diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Extensions/QueryableBulkExtensions.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Extensions/QueryableBulkExtensions.cs index a16de644b..4fcb50d24 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Extensions/QueryableBulkExtensions.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Extensions/QueryableBulkExtensions.cs @@ -8,7 +8,7 @@ namespace Elsa.Persistence.EntityFramework.Core.Extensions { public static class QueryableBulkExtensions { - public static async Task BatchDeleteWithWorkAroundAsync(this IQueryable queryable, ElsaContext elsaContext, CancellationToken cancellationToken = default) where T : class + public static async Task BatchDeleteWithWorkAroundAsync(this IQueryable queryable, DbContext elsaContext, CancellationToken cancellationToken = default) where T : class { if (elsaContext.Database.IsPostgres()) { diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/ElsaContextFactory.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/ElsaContextFactory.cs index 27c376af1..4519ece24 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/ElsaContextFactory.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/ElsaContextFactory.cs @@ -2,7 +2,7 @@ using Microsoft.EntityFrameworkCore; namespace Elsa.Persistence.EntityFramework.Core.Services { - public class ElsaContextFactory : IElsaContextFactory where TElsaContext:ElsaContext + public class ElsaContextFactory : IElsaContextFactory where TElsaContext : ElsaContext { private readonly IDbContextFactory _contextFactory; public ElsaContextFactory(IDbContextFactory contextFactory) => _contextFactory = contextFactory; diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/IDbContextFactory.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/IDbContextFactory.cs new file mode 100644 index 000000000..be06099a8 --- /dev/null +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/IDbContextFactory.cs @@ -0,0 +1,7 @@ +namespace Elsa.Persistence.EntityFramework.Core.Services +{ + public interface IContextFactory + { + TContext CreateDbContext(); + } +} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/IElsaContextFactory.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/IElsaContextFactory.cs index d12463db9..f6c097f73 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/IElsaContextFactory.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Services/IElsaContextFactory.cs @@ -1,7 +1,6 @@ namespace Elsa.Persistence.EntityFramework.Core.Services { - public interface IElsaContextFactory + public interface IElsaContextFactory : IContextFactory { - ElsaContext CreateDbContext(); } } \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/ElsaContextEntityFrameworkStore.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/ElsaContextEntityFrameworkStore.cs new file mode 100644 index 000000000..92abced5e --- /dev/null +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/ElsaContextEntityFrameworkStore.cs @@ -0,0 +1,13 @@ +using AutoMapper; +using Elsa.Models; +using Elsa.Persistence.EntityFramework.Core.Services; + +namespace Elsa.Persistence.EntityFramework.Core.Stores +{ + public abstract class ElsaContextEntityFrameworkStore : EntityFrameworkStore where T : class, IEntity + { + protected ElsaContextEntityFrameworkStore(IContextFactory dbContextFactory, IMapper mapper) : base(dbContextFactory, mapper) + { + } + } +} \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkBookmarkStore.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkBookmarkStore.cs index ab59c01f3..e19dd7939 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkBookmarkStore.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkBookmarkStore.cs @@ -7,7 +7,7 @@ using Elsa.Persistence.Specifications; namespace Elsa.Persistence.EntityFramework.Core.Stores { - public class EntityFrameworkBookmarkStore : EntityFrameworkStore, IBookmarkStore + public class EntityFrameworkBookmarkStore : ElsaContextEntityFrameworkStore, IBookmarkStore { public EntityFrameworkBookmarkStore(IElsaContextFactory dbContextFactory, IMapper mapper) : base(dbContextFactory, mapper) { diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkStore.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkStore.cs index 441160164..35c8fe3ad 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkStore.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkStore.cs @@ -13,18 +13,18 @@ using Microsoft.EntityFrameworkCore; namespace Elsa.Persistence.EntityFramework.Core.Stores { - public abstract class EntityFrameworkStore : IStore where T : class, IEntity + public abstract class EntityFrameworkStore : IStore where T : class, IEntity where TContext:DbContext { private readonly IMapper _mapper; private readonly SemaphoreSlim _semaphore = new(1); - protected EntityFrameworkStore(IElsaContextFactory dbContextFactory, IMapper mapper) + protected EntityFrameworkStore(IContextFactory dbContextFactory, IMapper mapper) { _mapper = mapper; DbContextFactory = dbContextFactory; } - protected IElsaContextFactory DbContextFactory { get; } + protected IContextFactory DbContextFactory { get; } public async Task SaveAsync(T entity, CancellationToken cancellationToken) { @@ -126,7 +126,7 @@ namespace Elsa.Persistence.EntityFramework.Core.Stores }, cancellationToken); } - private T ReadShadowProperties(ElsaContext dbContext, T entity) + private T ReadShadowProperties(TContext dbContext, T entity) { OnLoading(dbContext, entity); return entity; @@ -150,14 +150,14 @@ namespace Elsa.Persistence.EntityFramework.Core.Stores protected ValueTask DoWorkOnSet(Func, ValueTask> work, CancellationToken cancellationToken) => DoWork(dbContext => work(dbContext.Set()), cancellationToken); protected ValueTask DoWorkOnSet(Action> work, CancellationToken cancellationToken) => DoWork(dbContext => work(dbContext.Set()), cancellationToken); - protected async ValueTask DoWork(Func work, CancellationToken cancellationToken) + protected async ValueTask DoWork(Func work, CancellationToken cancellationToken) { await using var dbContext = DbContextFactory.CreateDbContext(); await work(dbContext); await dbContext.SaveChangesAsync(cancellationToken); } - protected async ValueTask DoWork(Func> work, CancellationToken cancellationToken) + protected async ValueTask DoWork(Func> work, CancellationToken cancellationToken) { await using var dbContext = DbContextFactory.CreateDbContext(); var result = await work(dbContext); @@ -165,20 +165,20 @@ namespace Elsa.Persistence.EntityFramework.Core.Stores return result; } - protected async ValueTask DoWork(Action work, CancellationToken cancellationToken) + protected async ValueTask DoWork(Action work, CancellationToken cancellationToken) { await using var dbContext = DbContextFactory.CreateDbContext(); work(dbContext); await dbContext.SaveChangesAsync(cancellationToken); } - protected virtual void OnSaving(ElsaContext dbContext, T entity) => OnSaving(entity); + protected virtual void OnSaving(TContext dbContext, T entity) => OnSaving(entity); protected virtual void OnSaving(T entity) { } - protected virtual void OnLoading(ElsaContext dbContext, T entity) => OnLoading(entity); + protected virtual void OnLoading(TContext dbContext, T entity) => OnLoading(entity); protected virtual void OnLoading(T entity) { diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowDefinitionStore.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowDefinitionStore.cs index 35f2fa5b6..1866a7f1c 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowDefinitionStore.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowDefinitionStore.cs @@ -9,7 +9,7 @@ using Newtonsoft.Json; namespace Elsa.Persistence.EntityFramework.Core.Stores { - public class EntityFrameworkWorkflowDefinitionStore : EntityFrameworkStore, IWorkflowDefinitionStore + public class EntityFrameworkWorkflowDefinitionStore : ElsaContextEntityFrameworkStore, IWorkflowDefinitionStore { private readonly IContentSerializer _contentSerializer; diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowExecutionLogRecordStore.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowExecutionLogRecordStore.cs index ab02993a6..d5eb77856 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowExecutionLogRecordStore.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowExecutionLogRecordStore.cs @@ -7,7 +7,7 @@ using Elsa.Persistence.Specifications; namespace Elsa.Persistence.EntityFramework.Core.Stores { - public class EntityFrameworkWorkflowExecutionLogRecordStore : EntityFrameworkStore, IWorkflowExecutionLogStore + public class EntityFrameworkWorkflowExecutionLogRecordStore : ElsaContextEntityFrameworkStore, IWorkflowExecutionLogStore { public EntityFrameworkWorkflowExecutionLogRecordStore(IElsaContextFactory dbContextFactory, IMapper mapper) : base(dbContextFactory, mapper) { diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowInstanceStore.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowInstanceStore.cs index 44bc148e7..ae424399b 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowInstanceStore.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Stores/EntityFrameworkWorkflowInstanceStore.cs @@ -13,7 +13,7 @@ using Newtonsoft.Json; namespace Elsa.Persistence.EntityFramework.Core.Stores { - public class EntityFrameworkWorkflowInstanceStore : EntityFrameworkStore, IWorkflowInstanceStore + public class EntityFrameworkWorkflowInstanceStore : ElsaContextEntityFrameworkStore, IWorkflowInstanceStore { private readonly IContentSerializer _contentSerializer;