< Summary

Information
Class: ArturRios.Data.Relational.Core.Transactions.EfUnitOfWork
Assembly: ArturRios.Data.Relational.Core
File(s): D:\Repositories\dotnet-data\src\ArturRios.Data.Relational.Core\Transactions\EfUnitOfWork.cs
Line coverage
51%
Covered lines: 28
Uncovered lines: 26
Coverable lines: 54
Total lines: 107
Line coverage: 51.8%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage
28%
Covered methods: 4
Fully covered methods: 1
Total methods: 14
Method coverage: 28.5%
Full method coverage: 7.1%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ExecuteInTransactionAsync()100%2281.81%
ExecuteInTransactionAsync()100%2263.63%
BeginTransactionAsync()100%210%
ExecuteInTransaction(...)100%11100%
ExecuteInTransaction(...)100%210%
BeginTransaction()100%210%
.ctor(...)100%210%
Commit()100%210%
Rollback()100%210%
CommitAsync(...)100%210%
RollbackAsync(...)100%210%
Dispose()100%210%
DisposeAsync()100%210%

File(s)

D:\Repositories\dotnet-data\src\ArturRios.Data.Relational.Core\Transactions\EfUnitOfWork.cs

#LineLine coverage
 1using ArturRios.Data.Relational.Core.Configuration;
 2using ArturRios.Output;
 3using Microsoft.EntityFrameworkCore.Storage;
 4
 5namespace ArturRios.Data.Relational.Core.Transactions;
 6
 7/// <summary>
 8///     Entity Framework Core implementation of <see cref="IUnitOfWork" /> and <see cref="IAsyncUnitOfWork" />.
 9///     Repository saves issued within the delegate flush but do not commit until the transaction commits.
 10/// </summary>
 11/// <param name="context">The application's <see cref="BaseDbContext" />.</param>
 912public class EfUnitOfWork(BaseDbContext context) : IUnitOfWork, IAsyncUnitOfWork
 13{
 14    /// <inheritdoc />
 15    public async Task<ProcessOutput> ExecuteInTransactionAsync(Func<Task> work, CancellationToken ct = default)
 116    {
 117        await using var tx = await context.Database.BeginTransactionAsync(ct);
 18        try
 119        {
 120            await work();
 021            await tx.CommitAsync(ct);
 022            return ProcessOutput.New;
 23        }
 124        catch (Exception ex)
 125        {
 126            await tx.RollbackAsync(ct);
 27
 128            return ProcessOutput.New.WithError(ex.GetBaseException().Message);
 29        }
 130    }
 31
 32    /// <inheritdoc />
 33    public async Task<DataOutput<TResult>> ExecuteInTransactionAsync<TResult>(Func<Task<TResult>> work,
 34        CancellationToken ct = default)
 235    {
 236        await using var tx = await context.Database.BeginTransactionAsync(ct);
 37        try
 238        {
 239            var result = await work();
 240            await tx.CommitAsync(ct);
 41
 242            return DataOutput<TResult>.New.WithData(result);
 43        }
 044        catch (Exception ex)
 045        {
 046            await tx.RollbackAsync(ct);
 47
 048            return DataOutput<TResult>.New.WithError(ex.GetBaseException().Message);
 49        }
 250    }
 51
 52    /// <inheritdoc />
 53    public async Task<IDbTransactionHandle> BeginTransactionAsync(CancellationToken ct = default) =>
 054        new EfTransactionHandle(await context.Database.BeginTransactionAsync(ct));
 55
 56    /// <inheritdoc />
 57    public ProcessOutput ExecuteInTransaction(Action work)
 258    {
 259        using var tx = context.Database.BeginTransaction();
 60        try
 261        {
 262            work();
 163            tx.Commit();
 64
 165            return ProcessOutput.New;
 66        }
 167        catch (Exception ex)
 168        {
 169            tx.Rollback();
 70
 171            return ProcessOutput.New.WithError(ex.GetBaseException().Message);
 72        }
 273    }
 74
 75    /// <inheritdoc />
 76    public DataOutput<TResult> ExecuteInTransaction<TResult>(Func<TResult> work)
 077    {
 078        using var tx = context.Database.BeginTransaction();
 79        try
 080        {
 081            var result = work();
 082            tx.Commit();
 83
 084            return DataOutput<TResult>.New.WithData(result);
 85        }
 086        catch (Exception ex)
 087        {
 088            tx.Rollback();
 89
 090            return DataOutput<TResult>.New.WithError(ex.GetBaseException().Message);
 91        }
 092    }
 93
 94    /// <inheritdoc />
 95    public IDbTransactionHandle BeginTransaction() =>
 096        new EfTransactionHandle(context.Database.BeginTransaction());
 97
 098    private sealed class EfTransactionHandle(IDbContextTransaction transaction) : IDbTransactionHandle
 99    {
 0100        public void Commit() => transaction.Commit();
 0101        public void Rollback() => transaction.Rollback();
 0102        public Task CommitAsync(CancellationToken ct = default) => transaction.CommitAsync(ct);
 0103        public Task RollbackAsync(CancellationToken ct = default) => transaction.RollbackAsync(ct);
 0104        public void Dispose() => transaction.Dispose();
 0105        public ValueTask DisposeAsync() => transaction.DisposeAsync();
 106    }
 107}