fix ระบบแจ้ง Error #2497
All checks were successful
Build & Deploy on Dev / build (push) Successful in 51s

This commit is contained in:
harid 2026-05-18 17:48:51 +07:00
parent e33448508e
commit 4ea7c0010b

View file

@ -566,9 +566,48 @@ public class ImportBackgroundService : BackgroundService
if (rec_import.ScoreImport != null && rec_import.ScoreImport.Scores != null)
{
// Store old ScoreImport ID and MinIO document ID for cleanup
var oldScoreImportId = rec_import.ScoreImport.Id;
var oldDocId = rec_import.ScoreImport.ImportFile?.Id;
// Delete old scores first
await _context.BulkDeleteAsync(rec_import.ScoreImport.Scores.ToList());
// Delete the old ScoreImport entity to prevent duplicate FK constraint
await _context.BulkDeleteAsync(new List<ScoreImport> { rec_import.ScoreImport });
// TODO: Implement retention policy for old MinIO documents
// For now, keep old files to allow recovery and avoid immediate deletion
// if (oldDocId.HasValue && oldDocId.Value != Guid.Empty)
// {
// try { await _minioService.DeleteFileAsync(oldDocId.Value); } catch { }
// }
// Clear ChangeTracker after bulk operations
_context.ChangeTracker.Clear();
}
// Reload to get fresh entity state after clearing
rec_import = await _context.RecruitImports.AsQueryable()
.Include(x => x.ImportHostories)
.FirstOrDefaultAsync(x => x.Id == job.RecruitImportId)
?? throw new Exception("RecruitImport not found after reload");
// get doc from minio
var doc = await _minioService.UploadFileAsync(new DummyFormFile(job.ImportFile));
var docId = doc.Id; // Store the ID before clearing tracker
// Detach document entity to prevent duplicate INSERT on next SaveChangesAsync
_context.Entry(doc).State = EntityState.Detached;
_context.ChangeTracker.Clear();
// Reload RecruitImport after clearing tracker to get fresh entity
rec_import = await _context.RecruitImports.AsQueryable()
.Include(x => x.ImportHostories)
.FirstOrDefaultAsync(x => x.Id == job.RecruitImportId)
?? throw new Exception("RecruitImport not found after MinIO upload");
// Add import history
rec_import.ImportHostories.Add(new RecruitImportHistory
{
Description = "นำเข้าข้อมูลผลคะแนนสอบ",
@ -580,12 +619,14 @@ public class ImportBackgroundService : BackgroundService
LastUpdateFullName = job.FullName ?? "System Administrator",
});
// get doc from minio
var doc = await _minioService.UploadFileAsync(new DummyFormFile(job.ImportFile));
// Load Document entity fresh from database to avoid tracking conflicts
var freshDoc = await _context.Documents.FindAsync(docId)
?? throw new Exception("Failed to retrieve uploaded document. Please contact support.");
var imported = new ScoreImport
{
Year = rec_import.Year,
ImportFile = doc,
ImportFile = freshDoc,
CreatedAt = DateTime.Now,
CreatedUserId = job.UserId ?? "",
CreatedFullName = job.FullName ?? "System Administrator",
@ -595,6 +636,9 @@ public class ImportBackgroundService : BackgroundService
Scores = new List<RecruitScore>()
};
// Add ScoreImport to context explicitly to ensure EF Core knows to INSERT it
_context.Add(imported);
// Save ScoreImport parent first to get its Id
rec_import.ScoreImport = imported;
await _context.SaveChangesAsync();