Erweiterte Programmierung


Die Datenbankprogrammierung erfolgt per Entity-Framework. Zur Zeit wird Entity-Framework 4 aus dem Namespace "System.Data.Objects" (iplus Version 4) und Entity Framework Core 8 (Version 5 auf gitHub),

Bevor Sie mit der Programmierung loslegen, sollten Sie sich gut mit der Funktionsweise von Entity-Framework und dem Change-Tracking-Mechanismus vertraut machen!

Dieses Wissen ist dringend nötig, um performante und speicheroptimierte Anwendungen programmieren zu können (siehe auch https://docs.microsoft.com/de-de/dotnet/framework/data/adonet/ef/performance-considerations). Daher hier ein paar wichtige Grundregeln, die Sie beachten sollen:

  1. Vermeiden Sie Langzeit-Kontexte. Instanziieren Sie Datenbankkontexte mit der using-Anweisung, damit der Speicher anschließend freigegeben wird.
  2. Falls Sie dennoch Langzeit-Datenbankkontexte benötigen, dann sichern Sie die Abfragen immer mit Threadsperren ab. Am besten verwenden sie die gip.core.datamodel.ACMonitor dafür. Diese Monitor-Klasse ist in der Lage während der Entwicklungsphase mögliche Deadlocks präventiv anzuzeigen und während der Laufzeit auftretende Deadlocks aufzulösen.
  3. Erzeugen Sie Langzeit-Datenbankkontexte nicht selbst, sondern mithilfe der Methode "gip.core.datamodel.ACObjectContextManager.GetOrCreateContext()". Der ACObjectContextManager ist eine statische Hilfsklasse, die zur Verwaltung von Langzeit-Kontexten dient. Damit Sie ihn nutzen können muss Ihr Datenbankmodell die Schnittstelle IACEntityObjectContext implementieren. Mehr dazu können Sie im Kapitel "iPlus mit eigenen Datenbankmodellen erweitern".
  4. Vermeiden Sie Change-Tracking, wenn es möglich ist. z.B. für Daten die nur gelesen werden.
  5. Wenn Daten nur zur Anzeige oder zum Lesen verwendet werden benutzen sie die Select-Abfrage mit dem new-Operator, um eigene anonyme oder bekannte Klassen zu erzeugen, die keine "System.Data.Objects.DataClasses.EntityObject" sind. Auch diese können mit dem ACClassInfo und ACPropertyInfo-Attributen versehen werden für die Präsentation an der Oberfläche und Rechteverwaltung.
  6. Wird Change-Tracking benötigt und es werden EntityObject-Instanzen materialisiert, dann versuchen Sie gleich mit der ersten Abfrage alle nötigen Relationen mittels der Include()-Erweiterungsmethode zu laden, damit Lazy-Loading vermieden wird.
  7. Verwenden Sie Vorkompilierte Abfragen.

 

In den nachfolgenden Abschnitten lernen Sie

  • welche Datenbankkontexte iPlus bereits zur Verfügung stellt und wie diese benutzt werden können,
  • wie Sie eigene Datenbankmodelle und Entity-Klassen hinzufügen können,
  • und wie sie speicherbare Abfragen programmieren.