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 : IEFUnitOfWork 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(); } } }