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); } }