Skip to content

Commit d6b3f5e

Browse files
committed
fix: execution policy wrapper
1 parent db9308f commit d6b3f5e

1 file changed

Lines changed: 60 additions & 48 deletions

File tree

application/CohortManager/src/Functions/Shared/DataServices.Core/DataServiceAccessor.cs

Lines changed: 60 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -37,69 +37,81 @@ public async Task<bool> InsertSingle(TEntity entity)
3737

3838
public async Task<bool> InsertMany(IEnumerable<TEntity> entities)
3939
{
40-
using var transaction = await _context.Database.BeginTransactionAsync();
40+
var strategy = _context.Database.CreateExecutionStrategy();
41+
var result = await strategy.ExecuteAsync( async () =>
42+
{
43+
using var transaction = await _context.Database.BeginTransactionAsync();
4144

42-
await _context.AddRangeAsync(entities);
43-
var result = await _context.SaveChangesAsync();
45+
await _context.AddRangeAsync(entities);
46+
var result = await _context.SaveChangesAsync();
4447

45-
await transaction.CommitAsync();
46-
return result > 0;
48+
await transaction.CommitAsync();
49+
return result > 0;
50+
});
51+
return result;
4752
}
4853

4954
public async Task<bool> Remove(Expression<Func<TEntity, bool>> predicate)
5055
{
51-
52-
using var transaction = await _context.Database.BeginTransactionAsync();
53-
var result = await _context.Set<TEntity>().AsNoTracking().SingleOrDefaultAsync(predicate);
54-
55-
if (result == null)
56-
{
57-
return false;
58-
}
59-
_context.Set<TEntity>().Remove(result);
60-
var rowsEffected = await _context.SaveChangesAsync();
61-
if(rowsEffected > 1)
56+
var strategy = _context.Database.CreateExecutionStrategy();
57+
var result = await strategy.ExecuteAsync( async () =>
6258
{
63-
await _context.Database.RollbackTransactionAsync();
59+
using var transaction = await _context.Database.BeginTransactionAsync();
60+
var result = await _context.Set<TEntity>().AsNoTracking().SingleOrDefaultAsync(predicate);
61+
62+
if (result == null)
63+
{
64+
return false;
65+
}
66+
_context.Set<TEntity>().Remove(result);
67+
var rowsEffected = await _context.SaveChangesAsync();
68+
if(rowsEffected > 1)
69+
{
70+
await _context.Database.RollbackTransactionAsync();
71+
72+
_logger.LogError("There was an error while trying to deleted despite a record being found");
73+
throw new MultipleRecordsFoundException("Multiple Records were updated by PUT request, Changes have been Rolled-back");
74+
}
6475

65-
_logger.LogError("There was an error while trying to deleted despite a record being found");
66-
throw new MultipleRecordsFoundException("Multiple Records were updated by PUT request, Changes have been Rolled-back");
67-
}
68-
69-
await _context.Database.CommitTransactionAsync();
70-
return true;
76+
await _context.Database.CommitTransactionAsync();
77+
return true;
78+
});
79+
return result;
7180

7281
}
7382

7483
public async Task<TEntity> Update(TEntity entity, Expression<Func<TEntity, bool>> predicate)
7584
{
76-
77-
78-
using var transaction = await _context.Database.BeginTransactionAsync();
79-
80-
var existingEntity = await _context.Set<TEntity>().AsNoTracking().SingleOrDefaultAsync(predicate);
81-
82-
if (existingEntity == null)
85+
var strategy = _context.Database.CreateExecutionStrategy();
86+
var result = await strategy.ExecuteAsync( async () =>
8387
{
84-
return null;
85-
}
86-
_context.Update(entity);
87-
var rowsEffected = await _context.SaveChangesAsync();
88-
89-
90-
if (rowsEffected == 1)
91-
{
92-
await _context.Database.CommitTransactionAsync();
93-
return entity;
94-
}
95-
else if (rowsEffected > 1)
96-
{
97-
await transaction.RollbackAsync();
98-
_logger.LogError("Multiple Records were updated by PUT request, Changes have been Rolled-back");
88+
using var transaction = await _context.Database.BeginTransactionAsync();
89+
90+
var existingEntity = await _context.Set<TEntity>().AsNoTracking().SingleOrDefaultAsync(predicate);
91+
92+
if (existingEntity == null)
93+
{
94+
return null;
95+
}
96+
_context.Update(entity);
97+
var rowsEffected = await _context.SaveChangesAsync();
98+
99+
100+
if (rowsEffected == 1)
101+
{
102+
await _context.Database.CommitTransactionAsync();
103+
return entity;
104+
}
105+
else if (rowsEffected > 1)
106+
{
107+
await transaction.RollbackAsync();
108+
_logger.LogError("Multiple Records were updated by PUT request, Changes have been Rolled-back");
109+
throw new MultipleRecordsFoundException("Multiple Records were updated by PUT request, Changes have been Rolled-back");
110+
}
111+
_logger.LogError("No records were updated despite a record being found");
99112
throw new MultipleRecordsFoundException("Multiple Records were updated by PUT request, Changes have been Rolled-back");
100-
}
101-
_logger.LogError("No records were updated despite a record being found");
102-
throw new MultipleRecordsFoundException("Multiple Records were updated by PUT request, Changes have been Rolled-back");
113+
});
114+
return result;
103115
}
104116

105117
}

0 commit comments

Comments
 (0)