From aedcd3f83a879dda83b373f34dd7c9cd74be7ec6 Mon Sep 17 00:00:00 2001 From: nns Date: Thu, 8 Oct 2026 02:10:11 +0500 Subject: [PATCH] =?UTF-8?q?fix(employees):=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=20=D0=BF=D1=80=D0=B8=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=BA=D0=BE=D0=B9=20=D0=BA=20=D1=82=D0=BE=D1=87=D0=BA=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=B4=D0=B0=D0=BB=D0=B0=20500=20(EF8=20nav-collect?= =?UTF-8?q?ion)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DbUpdateConcurrencyException «0 rows affected» при PUT сотрудника, у которого есть EmployeeRetailPointAssignment. Замена nav RemoveRange+Clear+Add на ExecuteDeleteAsync по EmployeeId + DbSet.Add (как в Supplies/Enters/Losses.Update). Co-Authored-By: Claude Opus 5.5 --- .../Organizations/EmployeesController.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/food-market.api/Controllers/Organizations/EmployeesController.cs b/src/food-market.api/Controllers/Organizations/EmployeesController.cs index a7131da..27ffdcc 100644 --- a/src/food-market.api/Controllers/Organizations/EmployeesController.cs +++ b/src/food-market.api/Controllers/Organizations/EmployeesController.cs @@ -283,12 +283,15 @@ public async Task Update(Guid id, [FromBody] EmployeeInput input, if (e.IsActive != nowActive) await SetLinkedUserActiveAsync(e.UserId, nowActive, ct); e.IsActive = nowActive; - // Replace assignments wholesale - _db.EmployeeRetailPointAssignments.RemoveRange(e.RetailPointAssignments); - e.RetailPointAssignments.Clear(); + // Replace assignments wholesale. ExecuteDelete + DbSet.Add вместо + // nav-collection RemoveRange+Clear+Add: иначе EF8 путается на + // nav-collection и UPDATE employees падает с DbUpdateConcurrencyException + // «0 rows affected» (у сотрудника с привязкой к точке правка была + // невозможна). Тот же паттерн, что в Supplies/Enters/Losses/Demands.Update. + await _db.EmployeeRetailPointAssignments.Where(a => a.EmployeeId == e.Id).ExecuteDeleteAsync(ct); foreach (var rpId in input.RetailPointIds ?? []) - e.RetailPointAssignments.Add(new EmployeeRetailPointAssignment - { OrganizationId = orgId, RetailPointId = rpId }); + _db.EmployeeRetailPointAssignments.Add(new EmployeeRetailPointAssignment + { OrganizationId = orgId, EmployeeId = e.Id, RetailPointId = rpId }); await _db.SaveChangesAsync(ct);