Table of Contents | ||
---|---|---|
|
Einfache Relationen
Relationen können über den ClassBuilder
hinzugefügt werden. Der RelationBuilder
erstellt dabei eine Relation von x → y und entsprechend von y → x.
...
In der folgenden Tabelle werden die unterschiedlichen AssociationType-Werte und die damit verbundene Platzierung des ForeignKeys und dessen Nullability beschrieben.
Quell-Tabelle | Quell-FK | Quell-Kardinalität | AssociationType | Ziel-Kardinalität | Ziel-Tabelle | Ziel-FK |
---|---|---|---|---|---|---|
A |
| 1 | OneToZeroOrOne | 0-1 | B | AId* |
A | BId | 0-1 | ZeroOrOneToZeroOrOne | 0-1 | B | |
A | BId* | 0-1 | ZeroOrOneToOne | 1 | B |
|
A |
| 0-1 | ZeroOrOneToMany | n | B | AId |
A |
| 1 | OneToMany | n | B | AId* |
A | BId | n | ManyToZeroOrOne | 0-1 | B |
|
A | BId* | n | ManyToOne | 1 | B |
|
Bei der ZeroOrOneToZeroOrOne Verbindung ist auch die Platzierung des FK auf der anderen Seite denkbar. Wir haben uns aber dazu entschieden, bei einer ZeroOrOneToZeroOrOne-Verbindung von A nach B den FK in A zu platzieren, damit auf A per SearchEdit ein B ausgewählt werden kann.
...
Caption => setzen der Captions welche auch im UI angezeigt werden.
Filter => Einschränken der Relation/Daten die geladen werden.
Control => Setzen des Control welches benutzt werden soll um die Relation anzuzeigen im UI.
RenameForeignKey => Umbenennen des Fremdschlüssel.
Generische Relationen
Es gibt immer wieder Use-Cases wo von einer Klasse aus eine Relation auf eine ganze Reihe von möglichen Klassen benötigt werden, wobei jeweils zur gleichen Zeit maximal nur eine dieser Relationen gesetzt ist. Anstatt dies mit einer (grossen Anzahl) von einzelnen Relationen abzubilden kommen hier generische Relationen resp. Entity References zum Zug. Dies ist z..B. im QuinoComments Modul der Fall um Kommentare an beliebige andere Klassen anhängen zu können.
Eine Entity Reference besteht nicht nur aus einem Foreign-Key der auf einen anderen Datensatz zeigt sondern auch dem Namen der Klasse auf welcher der Foreign-Key zeigt. Erst damit wird eine eindeutige Beziehung hergestellt.
Modell-Definition
Eine einfache generische (nullable) Relation wird mit
Code Block |
---|
classBuilder.Add.EntityReferenceProperties(); |
angefügt. Das erzeugt intern die drei Properties TargetClassName
, TargetObjectId
und TargetObjectTitle
wobei das letzte Property ein berechnetes Property ist und den Titel des referenzierten Objekts beinhaltet.
Mit
Code Block |
---|
classBuilder.Add.EntityReferenceProperties("Parent"); |
wird eine generische Relation eingefügt deren Property Namen den Prefix “Parent” haben. Das ermöglicht es auch mehr als eine generische Relation auf einer Klasse zu verwenden.
Wie andere Properties auch sind Entity References ohne weiteres Zutun nullable. Um eine Entity Reference nicht nullable zu machen braucht es also:
Code Block |
---|
classBuilder.Add.EntityReferenceProperties("Parent")
.IsNotNullable(); |
Verwendung in Layouts
Um eine Entity Reference in einer Liste anzzuzeigen wird am besten
Code Block |
---|
layout.Add.EntityReferenceColumn("Parent"); |
Und im Detail ist es dann
Code Block |
---|
group.Add.EntityReferenceLink("Parent"); |
Es gibt in der Klasse EntityReferenceExtensions
noch weitere Methoden für die Verwendung in Layouts die in bestimmten Situationen hilfreich sein können.
Verwendung im Code
Um zum Beispiel ein Comment-Objekt mit seinem Parent zu verbinden:
Code Block |
---|
comment.ReferenceObject(parentObj, "Parent"); |
Und um das Parent Objekt vom Comment her wieder zu laden:
Code Block |
---|
var parentObj = obj.FindReferencedObject<IDataObject>("Parent"); |