From aba8ea3ae3bc2f52165a562af1c4b8899e8e3967 Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Tue, 13 Jan 2026 10:01:37 -0500 Subject: [PATCH] Refactor event, student, and team deletion logic to improve tracking and error handling This commit updates the deletion logic in the Index.razor components for Events, Students, and Teams to load the entities fresh from the database with tracking. This change prevents tracking conflicts and ensures that the correct entity is deleted. Additionally, it adds error handling to notify users if the entity is not found or has already been deleted, enhancing the user experience and reliability of the deletion process. --- WebApp/Components/Features/Events/Index.razor | 19 ++++++++++++-- .../Components/Features/Students/Index.razor | 19 ++++++++++++-- WebApp/Components/Features/Teams/Index.razor | 25 ++++++++++++++++--- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/WebApp/Components/Features/Events/Index.razor b/WebApp/Components/Features/Events/Index.razor index 91573ba..780f764 100644 --- a/WebApp/Components/Features/Events/Index.razor +++ b/WebApp/Components/Features/Events/Index.razor @@ -143,12 +143,27 @@ if (result == true) { - Context.Events.Remove(evt!); + // Load the event fresh from database with tracking to avoid tracking conflicts + var eventToDelete = await Context.Events + .FirstOrDefaultAsync(e => e.Id == evt.Id, cancellationToken); + + if (_isDisposed) return; + + if (eventToDelete == null) + { + if (!_isDisposed) + { + Snackbar.Add("Event not found or already deleted", Severity.Warning); + } + return; + } + + Context.Events.Remove(eventToDelete); await Context.SaveChangesAsync(cancellationToken); if (!_isDisposed) { - Snackbar.Add($"Event {evt.Name} deleted", Severity.Info); + Snackbar.Add($"Event {eventToDelete.Name} deleted", Severity.Info); } } diff --git a/WebApp/Components/Features/Students/Index.razor b/WebApp/Components/Features/Students/Index.razor index 1186155..5bd2f3d 100644 --- a/WebApp/Components/Features/Students/Index.razor +++ b/WebApp/Components/Features/Students/Index.razor @@ -139,12 +139,27 @@ if (result == true) { - Context.Students.Remove(student!); + // Load the student fresh from database with tracking to avoid tracking conflicts + var studentToDelete = await Context.Students + .FirstOrDefaultAsync(s => s.Id == student.Id, cancellationToken); + + if (_isDisposed) return; + + if (studentToDelete == null) + { + if (!_isDisposed) + { + Snackbar.Add("Student not found or already deleted", Severity.Warning); + } + return; + } + + Context.Students.Remove(studentToDelete); await Context.SaveChangesAsync(cancellationToken); if (!_isDisposed) { - Snackbar.Add($"Student {student.Name} deleted", Severity.Info); + Snackbar.Add($"Student {studentToDelete.Name} deleted", Severity.Info); } } diff --git a/WebApp/Components/Features/Teams/Index.razor b/WebApp/Components/Features/Teams/Index.razor index 7ab0322..5169100 100644 --- a/WebApp/Components/Features/Teams/Index.razor +++ b/WebApp/Components/Features/Teams/Index.razor @@ -240,12 +240,29 @@ if (result == true) { + // Load the team fresh from database with tracking to avoid tracking conflicts + var teamToDelete = await Context.Teams + .Include(t => t.Event) + .Include(t => t.Students) + .FirstOrDefaultAsync(t => t.Id == team.Id, cancellationToken); + + if (_isDisposed) return; + + if (teamToDelete == null) + { + if (!_isDisposed) + { + Snackbar.Add("Team not found or already deleted", Severity.Warning); + } + return; + } + // If deleting a numbered team (1 or 2), clear the identifier of the remaining team - if (team.Identifier == "1" || team.Identifier == "2") + if (teamToDelete.Identifier == "1" || teamToDelete.Identifier == "2") { var remainingTeam = await Context.Teams .Include(t => t.Event) - .FirstOrDefaultAsync(t => t.Event.Id == team.Event.Id && t.Id != team.Id, cancellationToken); + .FirstOrDefaultAsync(t => t.Event.Id == teamToDelete.Event.Id && t.Id != teamToDelete.Id, cancellationToken); if (_isDisposed) return; @@ -256,12 +273,12 @@ } } - Context.Teams.Remove(team!); + Context.Teams.Remove(teamToDelete); await Context.SaveChangesAsync(cancellationToken); if (!_isDisposed) { - Snackbar.Add($"Team {team} deleted", Severity.Info); + Snackbar.Add($"Team {teamToDelete} deleted", Severity.Info); } }