From 79929dc6d2b69bb7723b2bb970d9e6c81ab1b490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 8 Apr 2024 07:17:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B0=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/CrudRepositoryBase.cs | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) 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();