From eea7fbcfa181e0bb427ea27b9e29734c152105ba Mon Sep 17 00:00:00 2001 From: harid Date: Tue, 19 May 2026 13:40:50 +0700 Subject: [PATCH] =?UTF-8?q?fix=20Update=20FK=20=E0=B8=95=E0=B8=B4=E0=B8=94?= =?UTF-8?q?=20Error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/ImportBackgroundService.cs | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/Services/ImportBackgroundService.cs b/Services/ImportBackgroundService.cs index 7b56e9c..ddc4036 100644 --- a/Services/ImportBackgroundService.cs +++ b/Services/ImportBackgroundService.cs @@ -790,15 +790,28 @@ public class ImportBackgroundService : BackgroundService await _context.SaveChangesAsync(); _context.ChangeTracker.Clear(); - // preload scores - re-query from DB to avoid tracking issues + // หา ScoreImportId ก่อน + var scoreImportId = await _context.ScoreImports + .Where(x => x.RecruitImportId == rec_import.Id) + .Select(x => x.Id) + .FirstOrDefaultAsync(); + + if (scoreImportId == Guid.Empty) return; + + // preload scores - query all entities that will be updated (with tracking) var scoreList = await _context.RecruitScores - .Where(s => s.ScoreImport.RecruitImportId == rec_import.Id && !string.IsNullOrEmpty(s.ExamId)) + .Where(s => EF.Property(s, "ScoreImportId") == scoreImportId && !string.IsNullOrEmpty(s.ExamId)) .GroupBy(x => x.ExamId) .Where(g => g.Count() == 1) .Select(g => g.First()) .ToListAsync(); + + // Group by ExamId for easy lookup var score = scoreList.ToDictionary(s => s.ExamId!, s => s); + // ถ้าไม่มีผลคะแนนสอบคัดเลือกผู้พิการให้จบการทำงาน + if (score.Count == 0) return; + // Read from saved file (ResultFile uses stream from Form, but we saved to disk) using var stream = System.IO.File.OpenRead(job.ImportFile); using var c_package = new ExcelPackage(stream); @@ -809,7 +822,6 @@ public class ImportBackgroundService : BackgroundService int batchCount = 0; const int batchSize = 500; var endRow = workSheet.Dimension.End.Row; - var batchUpdates = new List(); while (row <= endRow) { @@ -827,7 +839,6 @@ public class ImportBackgroundService : BackgroundService existingScore.LastUpdatedAt = DateTime.Now; existingScore.LastUpdateUserId = job.UserId ?? ""; existingScore.LastUpdateFullName = job.FullName ?? "System Administrator"; - batchUpdates.Add(existingScore); batchCount++; } @@ -835,16 +846,17 @@ public class ImportBackgroundService : BackgroundService if (batchCount >= batchSize) { - await _context.BulkUpdateAsync(batchUpdates); - batchUpdates.Clear(); + await _context.SaveChangesAsync(); + _context.ChangeTracker.Clear(); batchCount = 0; } } // Process remaining records - if (batchUpdates.Count > 0) + if (batchCount > 0) { - await _context.BulkUpdateAsync(batchUpdates); + await _context.SaveChangesAsync(); + _context.ChangeTracker.Clear(); } } }