EI-Image-Viewer-Api/IRaCIS.Core.Infra.EFCore/UnitOfWork/EFUnitOfWork.cs

63 lines
1.7 KiB
C#

using System;
using System.Data;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
namespace IRaCIS.Core.Infra.EFCore
{
public class EFUnitOfWork<TDbContext> :
IEFUnitOfWork<TDbContext> where TDbContext : DbContext
, IDisposable
{
public DbContext DbContext { get; }
// https://docs.microsoft.com/en-us/ef/core/saving/transactions
private IDbContextTransaction _transaction;
public EFUnitOfWork(TDbContext dbContext)
{
DbContext = dbContext;
}
public void BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.ReadCommitted)
{
if (DbContext.Database.IsRelational())
{
_transaction = DbContext.Database.BeginTransaction(isolationLevel);
}
}
public async Task BeginTransactionAsync(IsolationLevel isolationLevel = IsolationLevel.ReadCommitted)
{
if (DbContext.Database.IsRelational())
{
_transaction = await DbContext.Database.BeginTransactionAsync(isolationLevel);
}
}
//失败 自动回退
public virtual void Commit()
{
DbContext.SaveChanges();
_transaction?.Commit();
}
public virtual async Task CommitAsync(CancellationToken cancellationToken)
{
await DbContext.SaveChangesAsync(cancellationToken);
await _transaction?.CommitAsync(cancellationToken);
}
public virtual void Dispose()
{
_transaction?.Dispose();
}
}
}