...
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 (Parent-) Klassen anhängen zu können. Dieses Beispiel wird in den nachfolgenden Code-Samples auch wieder aufgegriffen.
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.
...
Code Block |
---|
classBuilder.Add.EntityReferencePropertiesEntityReference(); |
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 |
---|
classBuildercommentBuilder.Add.EntityReferencePropertiesEntityReference("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 |
---|
classBuildercommentBuilder.Add.EntityReferencePropertiesEntityReference("Parent") .IsNotNullable(); |
Und für Database-First oder andere individuelle Szenarien gibt es die Möglichkeit mit einem Aspekt die Propertynamen zu kontrollieren:
Code Block |
---|
commentBuilder.Add.EntityReference(new EntityReferenceAspect(...)) |
Verwendung in Layouts
Um eine Entity Reference in einer Liste anzzuzeigen anzuzeigen wird am besten
Code Block |
---|
layout.Add.EntityReferenceColumn("Parent"); |
...
Code Block |
---|
var parentObj = obj.FindReferencedObject<IDataObject>("Parent"); |
Filtern von :1 Sourcen
Beziehungen welche auf ein einzelnes Objekt verweisen zeigen im UI normalerweise eine Liste von möglichen Einträgen zur Auswahl an. Diese Auswahl kann eingeschränkt werden - auch in Abhängigkeit zum aktuell geöffneten Objekt.
Um die der Relation zur Verfügung stehenden Einträge zu reduzieren kann folgende Methode verwendet werden:
Code Block | ||
---|---|---|
| ||
Elements.Office.Add.Relation(AssociationType.ZeroOrOneToMany, Elements.Person)
.FilterSource("SourceObject.CompanyId == CompanyId") |
Der Aufruf von FilterSource
erstellt im Hintergrund eine neue virtuelle Relation welche beliebig gefiltert werden kann. In der Expression steht das aktuelle Objekt (wenn vorhanden) als SourceObject
zur Verfügung.
Diese Art von Filter führt dazu das die Auswahlliste neu geladen wird wenn eine abhängige Eigenschaft editiert wird. In diesem Beispiel wenn eine andere Company
ausgewählt wird und sich der Fremdschlüssel CompanyId
ändert.
Filtern von ValueList Sourcen
Die zur Auswahl stehenden Werte einer ValueList können ebenfalls eingeschränkt werden. Dabei wird jedoch lediglich der “enabled” state des entsprechenden Eintrag geändert.
Code Block | ||
---|---|---|
| ||
Elements.Person.Add.ValueListRelation(Elements.PersonMaritalStatus)
.IsValueListEntryEnabled(MaritalStatus.Married, "Active == true")
.IsValueListEntryEnabled(MaritalStatus.Divorced, "Active == true")
.IsValueListEntryEnabled(MaritalStatus.Single, "Active == true") |
Im obigen Beispiel stehen die Werte Married, Divorced und Single nur zur Verfügung wenn eine Person als aktiv markiert ist. Diese Einschränkung kann sowohl auf Level der Relationen als auch auf Level von PropertyLinks im Layout gemacht werden.
Die Expressions werden im Client evaluiert - asynchrone Expressions sind nicht unterstützt.