Files
gamification-service/Database/Repositories/UnitOfWork.cs
2025-09-20 23:27:32 +03:00

73 lines
1.4 KiB
C#
Executable File

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<bool> 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);
}
}