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.
This commit is contained in:
2026-01-13 10:01:37 -05:00
parent e2a5767b04
commit aba8ea3ae3
3 changed files with 55 additions and 8 deletions
+17 -2
View File
@@ -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);
}
}
@@ -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);
}
}
+21 -4
View File
@@ -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);
}
}