using Microsoft.EntityFrameworkCore.Storage; namespace GamificationService.Database.Repositories; public class UnitOfWork : IDisposable { #region fields protected ApplicationContext _context; private IDbContextTransaction? _transaction; #endregion public UnitOfWork(ApplicationContext context) { _context = context; } public bool Save() { return _context.SaveChanges() > 0; } public async Task SaveAsync() { return await _context.SaveChangesAsync() > 0; } public async Task BeginTransactionAsync() { if (_transaction is not null) throw new InvalidOperationException("A transaction has already been started."); _transaction = await _context.Database.BeginTransactionAsync(); } public async Task CommitAsync() { if (_transaction is null) throw new InvalidOperationException("A transaction has not been started."); try { await _transaction.CommitAsync(); } finally { await _transaction.DisposeAsync(); _transaction = null; } } private bool disposed = false; protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { _transaction?.Dispose(); // Dispose transaction if it exists _context.Dispose(); } disposed = true; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } }