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);