diff --git a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs index f5d11f38..900e181c 100644 --- a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Exceptions; using Microsoft.EntityFrameworkCore.ChangeTracking; namespace AsbCloudInfrastructure.Repository @@ -120,15 +121,26 @@ namespace AsbCloudInfrastructure.Repository { if (!dtos.Any()) return 0; - - var ids = dtos.Select(d => d.Id); - - var countExistingEntities = await dbSet - .Where(d => ids.Contains(d.Id)) + + var ids = dtos + .Select(o => o.Id) + .Distinct() + .ToArray(); + + if (ids.Any(id => id == default)) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь Id"); + + if (ids.Length != dtos.Count()) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь уникальные Id"); + + var dbSet = dbContext.Set(); + + var existingEntitiesCount = await dbSet + .Where(o => ids.Contains(o.Id)) .CountAsync(token); - - if (ids.Count() > countExistingEntities) - return ICrudRepository.ErrorIdNotFound; + + if (ids.Length != existingEntitiesCount) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны существовать в БД"); var entities = dtos.Select(Convert); var entries = entities.Select(entity => dbSet.Update(entity)).Cast().ToList(); @@ -145,9 +157,8 @@ namespace AsbCloudInfrastructure.Repository .FirstOrDefault(e => e.Id == id); if (entity == default) return Task.FromResult(ICrudRepository.ErrorIdNotFound); - var entry = dbSet.Remove(entity); + dbSet.Remove(entity); var affected = dbContext.SaveChangesAsync(token); - entry.State = EntityState.Detached; return affected; } @@ -164,10 +175,8 @@ namespace AsbCloudInfrastructure.Repository return ICrudRepository.ErrorIdNotFound; var entities = dbContext.Set().Where(e => ids.Contains(e.Id)); - var entries = entities.Select(entity => dbSet.Remove(entity)).Cast().ToList(); - var affected = await dbContext.SaveChangesAsync(token); - entries.ForEach(e => e.State = EntityState.Detached); - return affected; + dbContext.Set().RemoveRange(entities); + return await dbContext.SaveChangesAsync(token); } protected virtual TDto Convert(TEntity src) => src.Adapt();