Hinter jedem Fenster des Auftragsbuchs steht dieselbe Klasse: AuftragsDaten. Sie hält ein DataSet, lädt es mit drei Adaptern,
speichert es mit einem SqlCommandBuilder und liest nach jedem Speichern alles neu (Bruchstelle B4). Das hat zwanzig Jahre
funktioniert. Es hat aber eine Eigenschaft, die für das Web nicht taugt: Das Programm hält den ganzen Zustand im Speicher
eines Fensters, und alle Formulare teilen ihn. Eine Web-API (Modul 4) kann nicht ein DataSet für alle Benutzer halten.
Diese Lektion baut den Datenzugriff neu, mit Entity Framework Core (EF Core), als Projekt Brandt.Auftragsbuch.Daten neben dem
Programm. Die Formulare bleiben bis Lektion M4.2 beim DataSet; die neue Schicht entsteht, wird getestet und greift auf dieselbe
Datenbank zu. Wie beide dort zusammenleben, ist Thema von Lektion M3.3. Was EF Core ist und wie man es benutzt, steht in
K2, Modul 2.4 (Daten); hier steht nur, was das Auftragsbuch Besonderes verlangt.
Was das DataSet tut, und was an seine Stelle tritt
Bevor Sie etwas ersetzen, schreiben Sie auf, was es tut. AuftragsDaten leistet mehr, als der Name sagt:
| Das tut das alte Programm | Wo | Im neuen Code |
|---|---|---|
| Tabellen in den Speicher laden | SqlDataAdapter.Fill |
LINQ-Abfragen mit ToListAsync |
| Zeilen ohne Typ halten | DataTable, DataRow, row["Status"] |
Klassen mit Eigenschaften und Aufzählungen |
| Beziehungen zwischen Tabellen | DataRelation Kunde_Auftraege |
Navigationseigenschaften Kunde.Auftraege |
| Neue Zeilen vorläufig nummerieren (negativ) | AutoIncrementSeed = -1 |
EF Core vergibt vorläufige Werte und liest die Nummer nach dem Speichern zurück |
| INSERT, UPDATE, DELETE erzeugen | SqlCommandBuilder |
SaveChangesAsync |
| Gleichzeitige Änderung erkennen | CommandBuilder vergleicht alle alten Werte, Fehler DBConcurrencyException |
ein Konkurrenz-Token, Fehler DbUpdateConcurrencyException |
| Alles neu lesen nach dem Speichern | Speichern() ruft Laden() |
ein Kontext je Vorgang, kurzlebig |
| Anzeige filtern | DataView.RowFilter = "Status = '…'" |
LINQ Where mit Aufzählung statt Text |
Die Tabelle zeigt zwei Dinge. Das meiste hat in EF Core ein Gegenstück, das den Zweck besser erfüllt. Aber zwei Zeilen haben kein gleichwertiges Gegenstück ohne eigene Arbeit: die Sperre über alle Spalten und das, was die Datenbank selbst tut. Dazu gleich mehr.