diff options
Diffstat (limited to 'lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs')
-rw-r--r-- | lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs | 84 |
1 files changed, 64 insertions, 20 deletions
diff --git a/lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs b/lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs index e06ac43..cbb9799 100644 --- a/lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs +++ b/lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs @@ -23,24 +23,31 @@ */ using System; +using System.Linq; using System.Threading; using System.Threading.Tasks; +using System.Collections.Generic; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; +using VNLib.Utils; +using VNLib.Plugins.Extensions.Data.Abstractions; + + namespace VNLib.Plugins.Extensions.Data { /// <summary> /// Abstract implementation of <see cref="ITransactionalDbContext"/> that provides a transactional context for database operations /// </summary> - public abstract class TransactionalDbContext : DbContext, IAsyncDisposable, ITransactionalDbContext + public abstract class TransactionalDbContext : DbContext, IAsyncDisposable, ITransactionalDbContext, IDbContextHandle { /// <summary> /// <inheritdoc/> /// </summary> protected TransactionalDbContext() { } + /// <summary> /// <inheritdoc/> /// </summary> @@ -50,46 +57,83 @@ namespace VNLib.Plugins.Extensions.Data ///<inheritdoc/> public IDbContextTransaction? Transaction { get; set; } + ///<inheritdoc/> + public async Task OpenTransactionAsync(CancellationToken cancellationToken = default) + { + //open a new transaction on the current database + this.Transaction = await base.Database.BeginTransactionAsync(cancellationToken); + } -#pragma warning disable CA1816 // Dispose methods should call SuppressFinalize, ignore because base.Dispose() is called ///<inheritdoc/> - public sealed override void Dispose() + public Task CommitTransactionAsync(CancellationToken token = default) { - //dispose the transaction - Transaction?.Dispose(); - base.Dispose(); + return Transaction != null ? Transaction.CommitAsync(token) : Task.CompletedTask; } ///<inheritdoc/> - public override async ValueTask DisposeAsync() + public Task RollbackTransctionAsync(CancellationToken token = default) { - //If transaction has been created, dispose the transaction - if (Transaction != null) + return Transaction != null ? Transaction.RollbackAsync(token) : Task.CompletedTask; + } + + ///<inheritdoc/> + IQueryable<T> IDbContextHandle.Set<T>() => base.Set<T>(); + + ///<inheritdoc/> + void IDbContextHandle.Add<T>(T entity) => base.Add(entity); + + ///<inheritdoc/> + void IDbContextHandle.Remove<T>(T entity) => base.Remove<T>(entity); + + ///<inheritdoc/> + public virtual void AddRange<T>(IEnumerable<T> entities) where T : class + { + DbSet<T> set = base.Set<T>(); + set.AddRange(entities); + } + + ///<inheritdoc/> + public virtual async Task<ERRNO> SaveAndCloseAsync(bool commit, CancellationToken cancellation = default) + { + //Save db changes + ERRNO result = await base.SaveChangesAsync(cancellation); + if (commit) { - await Transaction.DisposeAsync(); + await CommitTransactionAsync(cancellation); } - await base.DisposeAsync(); + else + { + await RollbackTransctionAsync(cancellation); + } + return result; } -#pragma warning restore CA1816 // Dispose methods should call SuppressFinalize ///<inheritdoc/> - public async Task OpenTransactionAsync(CancellationToken cancellationToken = default) + public virtual void RemoveRange<T>(IEnumerable<T> entities) where T : class { - //open a new transaction on the current database - this.Transaction = await base.Database.BeginTransactionAsync(cancellationToken); + DbSet<T> set = base.Set<T>(); + set.RemoveRange(entities); } +#pragma warning disable CA1816 // Dispose methods should call SuppressFinalize, ignore because base.Dispose() is called ///<inheritdoc/> - public Task CommitTransactionAsync(CancellationToken token = default) + public sealed override void Dispose() { - return Transaction != null ? Transaction.CommitAsync(token) : Task.CompletedTask; + //dispose the transaction + Transaction?.Dispose(); + base.Dispose(); } ///<inheritdoc/> - public Task RollbackTransctionAsync(CancellationToken token = default) + public override async ValueTask DisposeAsync() { - return Transaction != null ? Transaction.RollbackAsync(token) : Task.CompletedTask; + //If transaction has been created, dispose the transaction + if (Transaction != null) + { + await Transaction.DisposeAsync(); + } + await base.DisposeAsync(); } - +#pragma warning restore CA1816 // Dispose methods should call SuppressFinalize } }
\ No newline at end of file |