Relationsdefinitionen basieren auf den Relationstypen und stellen die Sicht aus einer Datentabelle dar. Da technisch nur die Relationstypen abgespeichert werden, sind die Definitionen nur eine flexible Sicht darauf und können auch nachträglich geändert werden, wobei in dem Fall alle Stellen der Konfigurationen oder Formeln, an denen die Definitionen genutzt wurden umgestellt werden müssen. Es sind auch mehrere Definitionen auf Basis des gleichen Typs in einer Datentabelle möglich.

Relationsdefinitionen können per Konfiguration in Zieltabellen festgelegt werden. Diese Konfiguration verweist auf die möglichen Quelltabellen.
Technisch werden aus diesen Konfigurationen beim Neustarten des Systems Eigenschaften der Datentabellen, die beispielsweise in Reports direkt genutzt werden können.
Diese Eigenschaften können in der Programmierung auch direkt hinterlegt werden. Dies ist beispielsweise sinnvoll, wenn bestimmte Dinge unveränderlich sein sollen.
Eine Relationsdefinition hat immer ein Ziel und optional mehrere Quellen. Einer implementierten Eigenschaft in einem Ziel, können deshalb N Implementierungen in den Quellen zugeordnet sein. Die Namen der Eigenschaften in den Quellen müssen aber übereinstimmen.

Programmierte Relationsdefinitionen können ferner eine Basis-Datentabelle als Ziel haben, konfigurierte können das derzeit nicht.

Implementierung der Eigenschaft im Ziel

Man kann zwei Arten der Implementierung unterscheiden: Anzahl der maximalen Quelldatensätze gleich Eins und größer Eins. Der Unterschied liegt darin, dass die Eigenschaft entweder einen oder keinen Datensatz zurückliefert, bzw. wenn mehr als einer möglich ist, wird grundsätzlich eine Liste an Datensätze zurückgegeben.

Beispiel 1

Diese Eigenschaft wird in der Orm Klasse abgelegt. Beispielseweise in #OrmMyDataTable#
Maximale Anzahl == 1, Keine Relationskategorie

[Newtonsoft.Json.JsonIgnore]
[DontShowFieldInDesigner]
[RelationDefinitionTarget("[INSERT RELATION DEFINITION GUID EXAMPLE 1]", EnumRelationTypeExtension.MyRelationGuid, MinCount = 0, MaxCount = 1)]
public OrmRoleBase RelatedResponsible
{
    get {
        return GetSourcePrimary<OrmRoleBase>(EnumRelationTypeExtension.MyRelation);
    }
}

Beispiel 2

Diese Eigenschaft wird in der Orm Klasse abgelegt. Beispielseweise in #OrmMyDataTable#
Maximale Anzahl > 1, mit Relationskategorie

[Newtonsoft.Json.JsonIgnore]
[DontShowFieldInDesigner]
[RelationDefinitionTarget("[INSERT RELATION DEFINITION GUID EXAMPLE 2]", EnumRelationTypeExtension.MyRelationGuid, EnumMyRelationCategory.FirstValueGuid, MinCount = 0, MaxCount = 0)]
public IQueryable<OrmContact> RelatedContacts
{
    get {
        return GetSources<OrmContact>(EnumRelationTypeExtension.MyRelation, EnumMyRelationCategory.FirstValueGuid);
    }
}

Implementierung der Eigenschaften an den Quellen

Die Implementierung in einem Ziel kann pro Guid nur einmal erfolgen. Die Implementierung im Ziel, welche hier beschrieben wurde, kann in mehreren Quellen stattfinden, sollte aber mindestens einmal vorhanden sein. Über die angegebene Guid werden die Implementierungen entsprechend verknüpft. Die beiden folgenden Beispiele korrespondieren zu den beiden Beispielen im vorherigen Kapitel.

Beispiel 1

Diese Eigenschaft wird in der Orm Klasse abgelegt. Beispielseweise in #OrmUserProfile#.

[Newtonsoft.Json.JsonIgnore]
[DontShowFieldInDesigner]
[RelationDefinitionSource("[INSERT RELATION DEFINITION GUID EXAMPLE 1]")]
public IQueryable<OrmCompany> RelatedResponsible
{
    get {
        return GetTargets<OrmCompany>(EnumRelationTypeExtension.MyRelation);
    }
}

Beispiel 2

[Newtonsoft.Json.JsonIgnore]
[DontShowFieldInDesigner]
[RelationDefinitionSource("[INSERT RELATION DEFINITION GUID EXAMPLE 2]")]
public IQueryable<OrmCompany> RelatedCompanies
{
    get {
        return GetTargets<OrmCompany>(EnumRelationTypeExtension.MyRelation, EnumMyRelationCategory.FirstValueGuid);
    }
}

Implementierung über Inject-Attribute

Neben der direkten Implementierung der Eigenschaften, kann man mit diesen Attributen auch Relationsdefinitionen in Datentabellen, die nicht im eigenen Modul liegen, hinzufügen. Das kann Quelle und/oder Ziel einer Relationsdefinition betreffen.
Die Attribute RelationDefinitionSourceInject und RelationDefinitionTargetInject verhalten sich genauso wie RelationDefinitionSource bzw. RelationDefinitionTarget, nur dass sie auf Assembly-Ebene definiert werden und zusätzlich die Angabe der Klasse und des Namens für die zu erzeugende Eigenschaft enthalten.
Es sind auch Basis-Datentabellen als Quelle oder Ziele zulässig.

Beispiel 1

Nur die Target-Seite wird in die Datentabelle des Kontaktes eingefügt.

[assembly: RelationDefinitionTargetInject(typeof(OrmContact), "RelatedConformation", "[INSERT RELATION DEFINITION GUID]", EnumRelationTypeExtension.MyRelation, MinCount = 0, MaxCount = 1, Validate = false)]

Beispiel 2

Nur die Quelle wird in der Datentabelle der Telefonnotiz und der Email eingefügt.

[assembly: RelationDefinitionSourceInject(typeof(OrmPhoneCall), "RelatedConfirmedContacts", "[INSERT RELATION DEFINITION GUID]")]
[assembly: RelationDefinitionSourceInject(typeof(OrmEmail), "RelatedConfirmedContacts", "[INSERT RELATION DEFINITION GUID]")]

Beispiel 3

Beide Attribute werden in einem Vorgang eingefügt, ähnlich in Beispiel 1 und Beispiel 2, nur diesmal in alle Aktivitäten.

[assembly: RelationDefinitionTargetInject(typeof(OrmContact), "RelatedConformation", "[INSERT RELATION DEFINITION GUID]", EnumRelationType.ConformationGuid, MinCount = 0, MaxCount = 1, Validate = false)]
[assembly: RelationDefinitionSourceInject(typeof(OrmActivityBase), "RelatedConfirmedContacts", "[INSERT RELATION DEFINITION GUID]")]