Baustein 4: Repositories verdrahten Teil B (Kaskaden & Batch, Kapitel 10)
Die heiklen Faelle, die nicht ueber die oeffentliche Save/Delete-Methode laufen, sondern mehrere Collections direkt anfassen: GroupRepository (Save + Delete-Kaskade), ExamRepository.Delete, ExamResultRepository (Save/SaveMany), DocumentationRepository (Save/Delete/HardDelete), ParticipationSessionRepository.Delete, ParticipationRepository (SaveMany/DeleteBySession), CompetencyDomainRepository (inkl. Replace- /DeleteBySubjectAndGrade). Regel: pro oeffentlichem Repository-Aufruf genau EIN Sync-Ereignis (z.B. GroupRepository.Delete -> ein Group/Delete-Ereignis, nicht 14), Batch-Methoden feuern ein Ereignis pro betroffener Entitaet. Dafuer ExamRepository.Delete/ParticipationSessionRepository.Delete/ DocumentationRepository.HardDelete auf die in Baustein 2 vorbereiteten LiteDbContext-Kaskadenhelfer umgestellt (CascadeDeleteExam, CascadeDeleteParticipationSession, CascadeHardDeleteDocumentation) - dieselbe Kaskade existiert dadurch nur an einer Stelle im Code, nicht doppelt (wichtig fuer Baustein 5, wo ein eingehendes Sync-Ereignis sie erneut braucht). Tests pruefen explizit die Ereignis-Anzahl bei Kaskaden/Batches. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -156,6 +156,32 @@ public class LiteDbContext : IDisposable
|
||||
});
|
||||
}
|
||||
|
||||
/// Führt dieselbe Kaskade wie <c>ExamRepository.Delete</c> aus (siehe <see cref="CascadeDeleteGroup"/>).
|
||||
internal void CascadeDeleteExam(Guid id)
|
||||
{
|
||||
foreach (var result in ExamResults.Find(r => r.ExamId == id).ToList())
|
||||
ExamResults.Delete(result.Id);
|
||||
Exams.Delete(id);
|
||||
}
|
||||
|
||||
/// Führt dieselbe Kaskade wie <c>ParticipationSessionRepository.Delete</c> aus (siehe
|
||||
/// <see cref="CascadeDeleteGroup"/>).
|
||||
internal void CascadeDeleteParticipationSession(Guid id)
|
||||
{
|
||||
ParticipationSessions.Delete(id);
|
||||
foreach (var e in ParticipationEntries.Find(e => e.SessionId == id).ToList())
|
||||
ParticipationEntries.Delete(e.Id);
|
||||
}
|
||||
|
||||
/// Führt dieselbe Kaskade wie <c>DocumentationRepository.HardDelete</c> aus (siehe
|
||||
/// <see cref="CascadeDeleteGroup"/>).
|
||||
internal void CascadeHardDeleteDocumentation(Guid id)
|
||||
{
|
||||
if (Documentation.FindById(id) is { } doc)
|
||||
foreach (var attachment in doc.Attachments) Attachments.Delete(attachment.StorageId);
|
||||
Documentation.Delete(id);
|
||||
}
|
||||
|
||||
internal void ExecuteInTransaction(Action action)
|
||||
{
|
||||
_db.BeginTrans();
|
||||
|
||||
Reference in New Issue
Block a user