fix(employees): правка сотрудника с привязкой к точке падала 500 (EF8 nav-collection)

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 <noreply@anthropic.com>
This commit is contained in:
nns 2026-10-08 02:10:11 +05:00
parent 24646e0649
commit aedcd3f83a

View file

@ -283,12 +283,15 @@ public async Task<IActionResult> Update(Guid id, [FromBody] EmployeeInput input,
if (e.IsActive != nowActive) await SetLinkedUserActiveAsync(e.UserId, nowActive, ct); if (e.IsActive != nowActive) await SetLinkedUserActiveAsync(e.UserId, nowActive, ct);
e.IsActive = nowActive; e.IsActive = nowActive;
// Replace assignments wholesale // Replace assignments wholesale. ExecuteDelete + DbSet.Add вместо
_db.EmployeeRetailPointAssignments.RemoveRange(e.RetailPointAssignments); // nav-collection RemoveRange+Clear+Add: иначе EF8 путается на
e.RetailPointAssignments.Clear(); // 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 ?? []) foreach (var rpId in input.RetailPointIds ?? [])
e.RetailPointAssignments.Add(new EmployeeRetailPointAssignment _db.EmployeeRetailPointAssignments.Add(new EmployeeRetailPointAssignment
{ OrganizationId = orgId, RetailPointId = rpId }); { OrganizationId = orgId, EmployeeId = e.Id, RetailPointId = rpId });
await _db.SaveChangesAsync(ct); await _db.SaveChangesAsync(ct);