Einführung
In einer Charis-Lösung gibt es zwei verschiedene Arten von Datenbanken:
- die Modelldatenbank und
- die Anwendungsdatenbank.
Die Modelldatenbank wird von den Modellierern angelegt und gepflegt, also von den Entwicklern der Lösung. Sie entsteht zur Entwurfszeit und speichert das Modell der Lösung.
Die Anwendungsdatenbank dagegen nutzt die fertige Anwendung zur Laufzeit. Gepflegt wird sie von den Anwendern, also den Endanwendern der Lösung. In der Regel hat jeder Kunde seine eigene Anwendungsdatenbank. Selbst innerhalb einer Organisation kann es mehrere geben, zum Beispiel für Entwicklung, Test und Produktion.
Als Charis-Entwickler legst du viele Aspekte des Modells fest. Der wichtigste ist die Entität: Du definierst Entitäten (die Struktur der Daten), und die Endanwender pflegen die Daten dazu.
Manche Teile einer Lösung verlangen aber, dass du nicht nur die Struktur festlegst, sondern auch gleich die Daten dazu. Weil diese Daten schon beim Modellieren existieren, kannst du sie
- von anderen Modellelementen aus referenzieren und
- direkt im Code der Lösung verwenden.
Anders als Anwendungsdaten sind diese Daten Teil des Modells selbst. In Charis heißen sie Modelldaten.
Modelldaten werden in die Anwendungsdatenbank repliziert und stehen so zur Laufzeit zur Verfügung. Dadurch können auch Anwendungsdaten auf Objekte des Modells verweisen.
Obwohl diese Objekte in beiden Datenbanken vorkommen, bleiben sie „Modelldaten“, denn:
- Sie stammen aus dem Modell.
- Sie werden von den Entwicklern festgelegt und kontrolliert, und zwar zur Entwurfszeit.
- Endanwender können sie nicht grundlegend verändern.
Beispiel: Berechtigungen
- Ein Charis-Modell definiert eine Entität (eine Struktur für Daten) namens Berechtigung (privilege).
- Die Entwickler liefern dazu auch die Daten, nämlich als Modelldaten.
- Einstiegspunkte (user entry points), die ebenfalls zum Modell gehören, können bestimmte Berechtigungen voraussetzen. Deshalb müssen sich Berechtigungen schon beim Modellieren auswählen lassen.
- Zur Laufzeit legen die Anwender beim Kunden Benutzer an (Anwendungsdaten).
- Diesen Benutzern müssen Berechtigungen zugewiesen werden, und zwar genau die, die die Entwickler definiert haben.
Weil die Berechtigungen hier im Modell definiert, aber sowohl von Modellobjekten (Einstiegspunkten) als auch von Anwendungsobjekten (Benutzern) verwendet werden, müssen sie in beiden Datenbanken vorhanden sein.
Wozu Modelldaten?
Es gibt zwei Hauptgründe, Modelldaten zu verwenden.
Vordefinierte Daten
Wenn bestimmte Objekte im System auf jeden Fall vorhanden sein sollen, kannst du sie als Modelldaten definieren und schon zur Entwurfszeit anlegen.
So sind diese Objekte zur Laufzeit bereits da, selbst wenn die Anwendungsdatenbank gerade erst neu angelegt wurde. Die Endanwender können sofort damit arbeiten, ohne sie vorher selbst anlegen zu müssen.
Code, der von Daten abhängt
Wenn sich zur Laufzeit ändern kann, auf welches Objekt verwiesen wird, deine Anwendungslogik aber davon abhängt, worauf verwiesen wird, kannst du diese Objekte als Modelldaten definieren.
Dann sind die Objekte schon zur Entwurfszeit bekannt. Du kannst sie sicher im Code referenzieren und Logik bauen, die davon abhängt.
Das Modell für Modelldaten definieren
- Entität als model data markieren
- Behavior assure usable ausführen
Wenn du Entitäten definierst, beschreibst du die Struktur der Daten, also welche Daten es gibt und wie sie organisiert sind. Die Anwender füllen diese Struktur zur Laufzeit mit Inhalten.
Bei Modelldaten gehst du einen Schritt weiter: Du definierst nicht nur die Entität, sondern legst auch gleich Objekte dieser Entität in der Modellierungsumgebung an. Diese Objekte werden Teil des Modells.
Modelldaten zu definieren beginnt also mit einer Entität, genau wie bei jeder anderen. Anschließend aktivierst du auf dem Reiter additional details die Option model data.
Sobald diese Option aktiv ist, schaltet Charis automatisch dazu:
- copy model data, damit die Daten auch in der Anwendungsdatenbank landen, und
- referenced by LOID, damit sich die Objekte zuverlässig referenzieren lassen.
Wie bei jeder anderen Entität kannst du auch für Modelldaten-Entitäten eine Verwaltungsschicht erzeugen, indem du das Behavior assure usable ausführst. Es sorgt dafür, dass zur Modelldaten-Entität folgende Struktur existiert:
- eine Formularansicht (form view),
- eine Tabellenansicht (table view),
- eine Verwaltungsentität (administration entity) und
- ein Einstiegspunkt (user entry point).
Verwaltungsentität und Einstiegspunkt werden in diesem Fall ebenfalls als model data markiert.
Daten für Modelldaten erfassen
- Code generieren
- Charis schließen
- Sicherstellen, dass sich das Anwendungsprojekt (custom project) kompilieren lässt
- Charis neu starten
- Den Einstiegspunkt für die Modelldaten öffnen
- Objekte anlegen, ändern oder löschen
Wie bei jeder anderen Entität musst du nach dem Definieren erst Code generieren, bevor du sie verwenden kannst. Danach muss die Anwendung neu gestartet werden, damit die Änderungen wirksam werden.
In diesem Fall ist die Anwendung, die neu starten muss, allerdings Charis selbst. 🤯
Nach dem Neustart fasst Charis alle Einstiegspunkte für Modelldaten in einem eigenen Fenster mit dem Titel model data zusammen.
Siehst du dieses Fenster nicht? Klicke ins Hauptfenster von Charis und drücke F8.
Tipps für einen reibungslosen Ablauf
Code zu generieren und das Anwendungsprojekt kompilierbar zu halten, kann während der Entwicklung manchmal knifflig sein. Diese Tipps helfen dir dabei:
- validate model
- Die Prüfung des Modells vor der Codegenerierung lässt sich überspringen.
- assure objects project is published
- Das Bauen und Veröffentlichen des Anwendungsprojekts vor der Codegenerierung lässt sich überspringen.
- re-generate all entities
- Ohne diese Option wird nur Code für geänderte Entitäten, Attribute usw. erzeugt. Das beschleunigt die Codegenerierung erheblich.
- generate application project und generate service project
- Erzeugt das App-Projekt (die eigentliche App, zum Beispiel für Windows Forms) und das Dienstprojekt. Schaltest du beides ab, beschränkt sich die Generierung auf das Anwendungsprojekt (custom project), und das geht deutlich schneller.
- generate database backup
- Das Erzeugen der Sicherungsdatei der Modelldatenbank lässt sich überspringen, um die Codegenerierung zu beschleunigen.
Auf Modelldaten im Code zugreifen
- Modelldatenobjekte anlegen, ändern oder löschen
- Code generieren
- Modelldatenobjekte über die automatisch generierten statischen Variablen ihrer Basisklasse ansprechen
Für jedes Modelldatenobjekt wird in der zugehörigen Basisklasse eine statische Variable erzeugt. Ihr Name leitet sich aus dem Wert des identifizierenden Attributs ab. Der Wert wird dabei automatisch in einen gültigen Bezeichner der Programmiersprache umgewandelt.
Eine Berechtigung namens „Administrator“ erreichst du zum Beispiel über die statische Variable Administrator in der Klasse PrivilegeBase:
var privilege = PrivilegeBase.Administrator;
Der Zugriff über statische Member bringt dir einige Vorteile:
- sicherer und direkter Zugriff
- Prüfung schon beim Kompilieren dank starker Typisierung
- klarer, gut lesbarer Code beim Arbeiten mit vordefinierten Daten
- Verweise auf Modelldatenobjekte lassen sich leicht finden
Modelldaten im Modell referenzieren
Wie jede andere Entität kann auch eine Modelldaten-Entität die referenzierte Entität eines Attributs sein.
Ist für die Modelldaten-Entität die empfohlene Option referenced by LOID aktiv, muss das zugehörige Attribut den Typ reference by LOID verwenden.
So bleiben Verweise auf Modelldatenobjekte konsistent, stabil und sicher, auch über Deployments und Updates hinweg.
Technisch lassen sich Modelldaten auch über die ID referenzieren. Das empfehlen wir aber nicht.
Replikation in die Anwendungsdaten
Wird eine neue Version der Lösung ausgerollt, werden die Modelldaten in jede Anwendungsdatenbank repliziert. So stehen zur Laufzeit alle benötigten vordefinierten Objekte bereit. Wie das genau passiert, hängt davon ab, wie die Modelldaten referenziert werden.
Verweis über LOID
Charis überschreibt vorhandene Modelldaten in der Anwendungsdatenbank nicht einfach, sondern führt sie mit den Modelldaten aus dem aktualisierten Modell zusammen:
- Neue Modelldatenobjekte kommen in der Anwendungsdatenbank hinzu.
- Vorhandene Objekte werden aktualisiert, wenn sie sich im Modell geändert haben.
Weil Modelldaten über stabile Kennungen (LOIDs) identifiziert werden, kann Charis die passenden Objekte über Versionen hinweg zuverlässig zuordnen und aktualisieren.
Dadurch kann eine einzige Tabelle Objekte aus mehr als einem Modell enthalten. Das ist ein großer Vorteil, denn oft teilen sich mehrere Charis-Lösungen dieselbe Anwendungsdatenbank.
Modelldatenobjekte zu löschen musst du allerdings ausdrücklich über eine Datenmigrationsaufgabe erledigen.
Verweis über ID
Um die Kennungen konsistent zu halten, braucht es hier einen anderen Weg: Die zugehörige Tabelle in der Anwendungsdatenbank wird geleert. Alle Daten werden gelöscht und die Sequenzen zurückgesetzt. Danach legt Charis die Objekte anhand der Modelldefinition neu an.
Damit lassen sich Modelldaten aus mehreren Modellen nicht kombinieren, denn jede Replikation überschreibt die vorherige vollständig.