ChangeLogRepositoryAbstract add transaction to insertRange and updateRange methods

This commit is contained in:
ngfrolov 2024-02-06 16:49:29 +05:00
parent 9f25f631c5
commit 2468a0c2a1
Signed by: ng.frolov
GPG Key ID: E99907A0357B29A7
2 changed files with 13 additions and 11 deletions

View File

@ -18,11 +18,11 @@ public abstract class ChangeLogRepositoryAbstract<TDto, TEntity, TRequest> : ICh
where TEntity : ChangeLogAbstract where TEntity : ChangeLogAbstract
where TRequest : ChangeLogBaseRequest where TRequest : ChangeLogBaseRequest
{ {
protected readonly IAsbCloudDbContext context; protected readonly IAsbCloudDbContext db;
public ChangeLogRepositoryAbstract(IAsbCloudDbContext context) public ChangeLogRepositoryAbstract(IAsbCloudDbContext db)
{ {
this.context = context; this.db = db;
} }
public async Task<int> InsertRange(int idUser, IEnumerable<TDto> dtos, CancellationToken token) public async Task<int> InsertRange(int idUser, IEnumerable<TDto> dtos, CancellationToken token)
@ -30,9 +30,10 @@ public abstract class ChangeLogRepositoryAbstract<TDto, TEntity, TRequest> : ICh
var result = 0; var result = 0;
if (dtos.Any()) if (dtos.Any())
{ {
using var transaction = await db.Database.BeginTransactionAsync(token);
var entities = dtos.Select(Convert); var entities = dtos.Select(Convert);
var creation = DateTimeOffset.UtcNow; var creation = DateTimeOffset.UtcNow;
var dbSet = context.Set<TEntity>(); var dbSet = db.Set<TEntity>();
foreach (var entity in entities) foreach (var entity in entities)
{ {
entity.Id = default; entity.Id = default;
@ -46,6 +47,7 @@ public abstract class ChangeLogRepositoryAbstract<TDto, TEntity, TRequest> : ICh
} }
result += await SaveChangesWithExceptionHandling(token); result += await SaveChangesWithExceptionHandling(token);
await transaction.CommitAsync(token);
} }
return result; return result;
} }
@ -62,9 +64,8 @@ public abstract class ChangeLogRepositoryAbstract<TDto, TEntity, TRequest> : ICh
var ids = dtos.Select(d => d.Id); var ids = dtos.Select(d => d.Id);
using var transaction = context.Database.BeginTransaction();
var result = 0; var result = 0;
var dbSet = context var dbSet = db
.Set<TEntity>(); .Set<TEntity>();
var entitiesToDelete = await dbSet var entitiesToDelete = await dbSet
@ -80,13 +81,14 @@ public abstract class ChangeLogRepositoryAbstract<TDto, TEntity, TRequest> : ICh
throw new ArgumentInvalidException(nameof(dtos), $"записи с id:[{stringnotFoundIds}] не найдены, или не актуальны."); throw new ArgumentInvalidException(nameof(dtos), $"записи с id:[{stringnotFoundIds}] не найдены, или не актуальны.");
} }
using var transaction = db.Database.BeginTransaction();
foreach (var entity in entitiesToDelete) foreach (var entity in entitiesToDelete)
{ {
entity.IdState = ChangeLogAbstract.IdStateReplaced; entity.IdState = ChangeLogAbstract.IdStateReplaced;
entity.Obsolete = updateTime; entity.Obsolete = updateTime;
entity.IdEditor = idUser; entity.IdEditor = idUser;
} }
result += await context.SaveChangesAsync(token); result += await db.SaveChangesAsync(token);
var entitiesNew = dtos.Select(Convert); var entitiesNew = dtos.Select(Convert);
foreach (var entity in entitiesNew) foreach (var entity in entitiesNew)
@ -143,7 +145,7 @@ public abstract class ChangeLogRepositoryAbstract<TDto, TEntity, TRequest> : ICh
public async Task<int> ClearAndInsertRange(int idUser, TRequest request, IEnumerable<TDto> dtos, CancellationToken token) public async Task<int> ClearAndInsertRange(int idUser, TRequest request, IEnumerable<TDto> dtos, CancellationToken token)
{ {
var result = 0; var result = 0;
var transaction = await context.Database.BeginTransactionAsync(token); var transaction = await db.Database.BeginTransactionAsync(token);
result += await Clear(idUser, request, token); result += await Clear(idUser, request, token);
result += await InsertRange(idUser, dtos, token); result += await InsertRange(idUser, dtos, token);
await transaction.CommitAsync(token); await transaction.CommitAsync(token);
@ -153,7 +155,7 @@ public abstract class ChangeLogRepositoryAbstract<TDto, TEntity, TRequest> : ICh
public async Task<int> DeleteRange(int idUser, IEnumerable<int> ids, CancellationToken token) public async Task<int> DeleteRange(int idUser, IEnumerable<int> ids, CancellationToken token)
{ {
var updateTime = DateTimeOffset.UtcNow; var updateTime = DateTimeOffset.UtcNow;
var query = context.Set<TEntity>() var query = db.Set<TEntity>()
.Where(e => ids.Contains(e.Id)) .Where(e => ids.Contains(e.Id))
.Where(e => e.Obsolete == null); .Where(e => e.Obsolete == null);
@ -269,7 +271,7 @@ public abstract class ChangeLogRepositoryAbstract<TDto, TEntity, TRequest> : ICh
{ {
try try
{ {
var result = await context.SaveChangesAsync(token); var result = await db.SaveChangesAsync(token);
return result; return result;
} }
catch (DbUpdateException ex) catch (DbUpdateException ex)

View File

@ -23,7 +23,7 @@ public class ProcessMapPlanBaseRepository<TDto, TEntity> : ChangeLogRepositoryAb
protected override IQueryable<TEntity> BuildQuery(ProcessMapPlanBaseRequestWithWell request) protected override IQueryable<TEntity> BuildQuery(ProcessMapPlanBaseRequestWithWell request)
{ {
var query = context var query = db
.Set<TEntity>() .Set<TEntity>()
.Include(e => e.Author) .Include(e => e.Author)
.Include(e => e.Editor) .Include(e => e.Editor)