fix(migration): import — ChangeTracker.Clear при сбое товара (устранить каскад потери прогона)
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
nns 2026-10-09 20:48:18 +05:00
parent 99c2fc1e5a
commit 1ee3c9b598

View file

@ -538,13 +538,19 @@ await foreach (var p in _client.StreamProductsAsync(token, ct, includeArchived:
}
catch (Exception ex)
{
_log.LogWarning(ex, "Failed to import MoySklad product {Name}", p.Name);
errors.Add($"{p.Name}: {ex.Message}");
// ВАЖНО: очищаем ChangeTracker, иначе неудачный батч-SaveChanges оставляет
// «отравленные» сущности и КАЖДЫЙ следующий SaveChanges падает каскадом
// (теряется весь прогон). Теперь сбой одного товара не роняет остальные.
_db.ChangeTracker.Clear();
var inner = ex.InnerException?.Message ?? ex.Message;
_log.LogWarning(ex, "Failed to import MoySklad product {Name}: {Inner}", p.Name, inner);
errors.Add($"{p.Name}: {inner}");
if (progress is not null) progress.Errors = errors;
}
}
await _db.SaveChangesAsync(ct);
try { await _db.SaveChangesAsync(ct); }
catch (Exception ex) { _db.ChangeTracker.Clear(); _log.LogWarning(ex, "Final products SaveChanges failed: {Inner}", ex.InnerException?.Message ?? ex.Message); }
// Финальная проверка дубликатов штрихкодов (на всякий, если
// уникальный индекс был нарушен исторически).