Der zweite Meilenstein macht die Termine des Büros fertig. Sie gehören zu Kontakten, sie liegen im Wochenkalender und in der Terminliste, und vor allem überschneiden sie sich nie. Diese letzte Regel ist der Kern der Lektion. Sie steht schon seit K1 im Modell. Neu ist, dass die Datenbank sie auch dann durchsetzt, wenn zwei Personen im selben Augenblick speichern, und das für Termine jeder Länge.

Der Schnitt in Pull Requests:

Pull Request Branch Bringt Wo in dieser Lektion
1 feature/m2-appointment-times die Regeln für die Zeiten, der Planer im Kern Übung 1 und „Der Planer“
2 feature/m2-occupied-quarters belegte Viertelstunden in der Datenbank, 409 bei einer Überschneidung „Pull Request 2“ und Übung 2
3 feature/m2-appointment-contact der Kontakt im Formular, die nächsten Termine auf der Kontaktseite Übung 3
4 feature/m2-names-in-calendar Namen der Kontakte im Wochenkalender und in der Terminliste Übung 3

Wo die Kladde steht

Nach Meilenstein 1 gilt in den Lösungen:

  • Appointment in Kladde.Core hat Id, Title, Time (das Wertobjekt TimeRange aus K1 mit Start und End, beide DateTimeOffset) und int? ContactId. In EF Core ist Time ein Complex Type mit den Spalten Start und End.
  • TimeRange.Overlaps ist die Regel aus K1: Zwei Zeiträume überschneiden sich, wenn jeder vor dem Ende des anderen beginnt. Berühren ist keine Überschneidung, 9 bis 10 Uhr und 10 bis 11 Uhr passen nebeneinander.
  • Die öffentliche Buchung hat feste Längen. Für sie verhindert seit Lektion 2.4.10 ein eindeutiger Index auf dem Beginn die Doppelbuchung.
  • Der Wochenkalender ist eine Insel mit InteractiveServer (2.5.8), die Terminliste ein QuickGrid (2.5.9). Beide zeigen den Titel, aber nicht den Kontakt.
  • Seit Meilenstein 1 bleiben Termine eines gelöschten Kontakts erhalten; ihr ContactId ist dann null.

In den Lösungen von Modul 2.4 sieht die Speicherung anders aus: Ein Termin kann dort mehrere Kontakte haben (Tabelle AppointmentContacts), und Kladde.Data speichert ihn als AppointmentRow mit den Spalten Start und End (Lektionen 2.4.6 und 2.4.11). Dann übertragen Sie die Schritte so: Die Viertelstunden aus Pull Request 2 hängen an AppointmentRow, das Formular aus Übung 3 wählt einen oder mehrere Kontakte, und die Projektion liest die Namen über AppointmentContacts. Die Regel im Modell und die Einschränkung in der Datenbank bleiben dieselben.

Heißen Ihre Dateien, Klassen oder Ordner anders, behalten Sie Ihre Namen und übertragen Sie die Schritte.