Der Entity-Framework-Generator generiert Entity-Frameworkklassen anhand der T4-Vorlage folgende Klassen-Signatur:
public partial class Material : VBEntityObject, IInsertInfo, IUpdateInfo, IDeleteInfo
gip.core.datamodel.VBEntityObject ist die Basisklasse für alle Entity-Klassen, damit die zusätzlichen iPlus-Features genutzt werden können. Sie spezifiziert eine Reihe von virtuellen Methoden und gemeinsamen Funktionalitäten, die in den Ableitungen überschrieben bzw. wiederverwendet werden können. Die Schnittstellen IInsertInfo, IUpdateInfo und IDeleteInfo werden automatisch hinzugefügt, weil das T4-Template im edmx-Modell die Entities nach den Feldern "InsertDate, InsertName, UpdateName..." untersucht.
Den restlichen Programmcode programmieren Sie dann in einer weiteren C#-Datei wo sie die partielle Klasse erweitern (Siehe F im ersten Bild oben). Die Partielle Klasse sollte mit den folgenden farblich umrandeten Code-Bereichen erweitert werden:
Partielle Klassendefinition (A)
Fügen Sie eine partielle Klassendefinition hinzu.
Klassen und Eigenschaftsbeschreibung mittels Attributklassen
(A) & (B): Fügen Sie eine ACClassInfo-Attributklasse (A) mit Global.ACKinds.TACDBA (B) hinzu. Damit geben Sie diese Entity-Klasse dem iPlus-Framework bekannt. Sie erscheint dann in der Entwicklungsumgebung unterhalb der zugehörigen Datenbankkontextklasse im iPlus-Anwendungsbaum (Das gilt auch für den Model-First-Ansatz).
(C): Da die Eigenschaften der Entity-Klasse in der anderen partiellen Klasse dekariert sind, die vom T4-Template-Generator erstellt wurde, kann das ACClassPropertyInfo-Attribut nicht dort deklariert werden, weil sie durch ein erneutes Ausführen des T4-Templates wieder entfernt wird. Stattdessen verwenden Sie die ACPropertyEntity-Attributklasse (C). Für jedes Datenbankfeld bzw. Eigenschaft der Entity-Klasse deklarieren Sie eine ACPropertyEntity-Zeile und geben im ersten Parameter den Namen der Eigenschaft an. Die Restlichen Kontruktionsparameter sind dieselben wie auch bei der ACClassPropertyInfo-Klasse. Bei String-Eigenschaften (SQL-Typ varchar) geben Sie die maximale Länge des Strings mit "MaxLength" an.
Falls Sie jedoch den Model-First-Ansatz verwenden (indem Sie auf die iPlus-Features verzichten) können Sie Ihre Eigenschaften ganz normal mit dem ACClassPropertyInfo-Attribut versehen.
(D): Optional: Definieren Sie ein Template für die Speicherbaren Abfragen (ACQueryDefinition). Eine Speicherbare Abfrage sollte immer dann definiert werden, wenn die Tabelle (bzw. die Entity-Klasse) in Businessobjekten die Haupttabelle ist nach der gefiltert und navigiert wird.
(F): Optional: Definieren Sie ein ACSerializable-Attribut, damit ein Intelligenter-Zeiger auf ein Objekt dieser Entity-Klasse in einer netzwerkfähigen Eigenschaft verwendet werden kann.
Implementierung von VBEntityObject
VBEntityObject besitzt einige virtuelle Methoden mit einer Standardimplementierung für das Hinzufügen, Löschen und Ändern von Objekten. Überschreiben Sie diese, wenn Sie Ihre individuelle Logik hinzufügen möchten und rufen Sie am Ende der Methode die Basis-Implementierung auf.
(A): Für das Hinzufügen von neuen Objekten deklarieren Sie eine statische Methode mit folgender Signatur:
public static MyEntityClassT NewACObject(MyDbContextClass dbApp, IACObject parentACObject, string secondaryKey)
In dieser Methode erzeugen Sie dann eine neue Instanz der Entity-Klasse (MyEntityClassT) und setzen den Primärschlüssel mit einer neuen GUID (B).
(C): Rufen Sie anschließend die Erweiterungs-Methode DefaultValuesACObject() auf, damit alle Eigenschaften Ihrer Entity-Klasse bzw. generell eines IACObject's mit den Default-Werten initialisiert wird, die in der Entwicklungsumgebung konfiguriert worden sind.
(D): Falls Ihre Tabelle einen Sekundärschlüssel besitzt (Ein Datenbankfeld mit einem leserlichen Schlüssel) können Sie diesen über den Nummerngenerator generieren lassen und die neue Nummer dem "secondaryKey"-Parameter übergeben. Die Nummernkreise des Nummerngenerators können Sie mit dem Businessobjekt vorab gip.bso.iplus.BSONoConfiguration konfigurieren.
(E): Rufen Sie die SetInsertAndUpdateInfo()-Methode auf um den Usernamen und die aktuelle Uhrzeit in die "Insert"-Felder eintragen zu lassen.
Achtung: Das Objekt befindet sich noch nicht im Change-Tracking! Entweder fügen Sie das neu generierte Objekt sofort in den DB-Kontext hinzu oder machen Sie das außerhalb der NewACObject()-Methode.