From b05d365ffb82e0d9a6543d3434b79ae630891c53 Mon Sep 17 00:00:00 2001 From: RTX4070TI Date: Thu, 14 Nov 2024 16:01:17 +0100 Subject: [PATCH] fix: add SetIdentityInsert method to handle manual ID insertion in PatientDb - fix an issue where SeedPatients could create patients with unexpected IDs, causing seeded notes to fail linking correctly to patients. Notes rely on predefined IDs (1 to 4) to establish the relationship by : - adding new method SetIdentityInsert to enable manual insertion of ID values for Patients in the PatientDb database - adding transaction support and implementing identity_insert handling in DataSeeder for patient seeding --- BackendPatient/Data/DataSeeder.cs | 59 +++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/BackendPatient/Data/DataSeeder.cs b/BackendPatient/Data/DataSeeder.cs index 5ffec30..5624bad 100644 --- a/BackendPatient/Data/DataSeeder.cs +++ b/BackendPatient/Data/DataSeeder.cs @@ -1,4 +1,5 @@ using BackendPatient.Models; +using Microsoft.EntityFrameworkCore; namespace BackendPatient.Data; public class DataSeeder(ApplicationDbContext dbContext) @@ -34,33 +35,55 @@ public void SeedPatients() int batchSize = 10; int counter = 0; - foreach (Patient patient in patientsFormatted) + using var transaction = _dbContext.Database.BeginTransaction(); + try { - // Avoid duplicate patients - if (existingPatients.Exists(p => p.FirstName == patient.FirstName && - p.LastName == patient.LastName && - p.DateOfBirth == patient.DateOfBirth)) + SetIdentityInsert("Patients", true); + + foreach (Patient patient in patientsFormatted) { - Console.WriteLine($"Skipping duplicate patient: {patient.FirstName} {patient.LastName} {patient.DateOfBirth}"); - continue; + // Avoid duplicate patients + if (existingPatients.Exists(p => p.FirstName == patient.FirstName && + p.LastName == patient.LastName && + p.DateOfBirth == patient.DateOfBirth)) + { + Console.WriteLine($"Skipping duplicate patient: {patient.FirstName} {patient.LastName} {patient.DateOfBirth}"); + continue; + } + patient.Id = counter + 1; + _dbContext.Patients.Add(patient); + counter++; + + // Save every 10 patients (batch size) + if (counter % batchSize == 0) + { + _dbContext.SaveChanges(); + Console.WriteLine($"Saved {counter} patients so far..."); + } } - patient.Id = counter + 1; - _dbContext.Patients.Add(patient); - counter++; - // Save every 10 patients (batch size) - if (counter % batchSize == 0) + // Save any remaining patients + if (counter % batchSize != 0) { _dbContext.SaveChanges(); - Console.WriteLine($"Saved {counter} patients so far..."); + Console.WriteLine($"Final save, total patients saved: {counter}"); } - } - // Save any remaining patients - if (counter % batchSize != 0) + transaction.Commit(); + } + catch { - _dbContext.SaveChanges(); - Console.WriteLine($"Final save, total patients saved: {counter}"); + transaction.Rollback(); + throw; } + + } + + private void SetIdentityInsert(string tableName, bool enable = true) + { + string sql = enable + ? $"SET IDENTITY_INSERT {tableName} ON;" + : $"SET IDENTITY_INSERT {tableName} OFF;"; + _dbContext.Database.ExecuteSqlRaw(sql); } } \ No newline at end of file