Files
pos-system/services/mining-service-net/src/MiningService.Infrastructure/MiningServiceContext.cs

91 lines
2.7 KiB
C#

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using MiningService.Domain.AggregatesModel.MinerAggregate;
using MiningService.Domain.AggregatesModel.CircleAggregate;
using MiningService.Domain.AggregatesModel.ReferralAggregate;
using MiningService.Domain.SeedWork;
namespace MiningService.Infrastructure;
/// <summary>
/// EN: Database context for Mining Service.
/// VI: Database context cho Mining Service.
/// </summary>
public class MiningServiceContext : DbContext, IUnitOfWork
{
private IDbContextTransaction? _currentTransaction;
public DbSet<Miner> Miners { get; set; } = null!;
public DbSet<MiningHistory> MiningHistories { get; set; } = null!;
public DbSet<Circle> Circles { get; set; } = null!;
public DbSet<CircleMember> CircleMembers { get; set; } = null!;
public DbSet<Referral> Referrals { get; set; } = null!;
public bool HasActiveTransaction => _currentTransaction != null;
public MiningServiceContext(DbContextOptions<MiningServiceContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(typeof(MiningServiceContext).Assembly);
}
public async Task<bool> SaveEntitiesAsync(CancellationToken cancellationToken = default)
{
await SaveChangesAsync(cancellationToken);
return true;
}
public async Task<IDbContextTransaction?> BeginTransactionAsync(CancellationToken cancellationToken = default)
{
if (_currentTransaction != null) return null;
_currentTransaction = await Database.BeginTransactionAsync(cancellationToken);
return _currentTransaction;
}
public async Task CommitTransactionAsync(IDbContextTransaction transaction)
{
if (transaction != _currentTransaction)
throw new InvalidOperationException($"Transaction {transaction.TransactionId} is not current");
try
{
await SaveChangesAsync();
await transaction.CommitAsync();
}
catch
{
RollbackTransaction();
throw;
}
finally
{
if (_currentTransaction != null)
{
await _currentTransaction.DisposeAsync();
_currentTransaction = null;
}
}
}
public void RollbackTransaction()
{
try
{
_currentTransaction?.Rollback();
}
finally
{
if (_currentTransaction != null)
{
_currentTransaction.Dispose();
_currentTransaction = null;
}
}
}
}