Um Relationstypen programmatisch anzulegen muss zuerst eine Erweiterung der Auswahlliste EnumRelationType vorgenommen werden.

[EnumExtension(typeof(EnumRelationType))]
public static class EnumRelationTypeExtension
{
    public const string MyRelationGuid = "[INSERT RELATION TYPE GUID]";
    public static readonly EnumRelationType MyRelation = new EnumRelationType(MyRelationGuid, 1000, "[INSERT TRANSLATION GUID]", nameof(MyRelation));
}

Anschließend legt man eine Klasse mit dem Interface IRelationCreation im Ordner “Configuration” an. Beim Start des Systems werden diese Relationen automatisch angelegt. Die neuen Relationstypen müssen gut geplant werden, da diese nicht mehr verändert werden können.

public class RelationCreation : IRelationCreation
{
    public void CreateRelationConfigurations(KeyedDictionary<Guid, RelationTypeConfiguration> relationConfigurations)
    {
        relationConfigurations.Add(MyRelation());
    }

    private RelationTypeConfiguration MyRelation()
    {
        relationConfigurations.Add(new RelationTypeConfiguration()
        {
            Id = EnumRelationTypeExtension.MyRelation,
            Description = "My Relation",
            ShowInDesigner = true,
        }
        .Initialize();

        return relationConfiguration;
    }
}

Definition der möglichen Datentabellen als Ziel bzw. Quelle

Quellen und / oder Ziele können eingeschränkt werden, dass bedeutet als Quelle und / oder Ziel können nur bestimmte Datentabellen genutzt werden. Dazu wird .Initialize(); um Parameter ergänzt.

Quellen einschränken

Falls als Betreuer (Quelle) nur Benutzer in Frage kommen, fügt man dies hinzu.

.Initialize(EnumDataSource.UserProfile, null);

Können neben Betreuern auch Rollen gewählt werden (Die Benutzer selbst basieren ebenfalls auf der Basis-Datentabelle Basis.Rollen), kann die entsprechende Basis-Datentabelle gesetzt werden.

.Initialize(EnumDataSource.RoleBase, null);

Können neben Benutzern auch Kontakte als Betreuer gewählt werden, fügt man zwei Quellen der Relation hinzu.

.Initialize( new [] { EnumDataSource.UserProfile), EnumDataSourceExtension.Contact }, null);

Ziele einschränken

Falls die Betreuer nur Firmen betreuen können, fügt man dies hinzu.

.Initialize(EnumDataSource.UserProfile, EnumDataSourceExtension.Company);

Wie im vorherigen Abschnitt können auch Basis-Datentabellen oder mehrere Datentabellen gesetzt werden. Auch kann die Einschränkung der Quelle auf null gesetzt werden.

Relationskategorie

Um Relationskategorien in der Relation zu nutzen, muss eine Auswahlliste angelegt werden und der Relation zugeordnet werden.

relationConfiguration.RelationCategoryEnum = EnumMyRelationCategory.Guid

ShowInDesigner

Sollen die Quellen und Ziele der Relationen in der Konfiguration geändert werden können, dann sollte man ShowInDesigner auf true setzen, in anderen Fällen auf false.

TrackHierarchy

Falls die eigene Relation eine hierarchische Relation sein soll, muss TrackHierarchy auf true gesetzt werden. Die Anlage einer eigenen hierarchischen Relation sollte genau überlegt werden, da dafür ein erhöhter Verwaltungsaufwand notwendig ist. Eine solche Relation legt man dann an, wenn über mehrere Ebenen über diese Relation auf Quellen zugegriffen werden soll.

Die “Eltern” Relation aus dem System ist beispielsweise eine solche Relation. Damit ist es möglich auf allen Ebenen beispielsweise auf die Firma oder den Kontakt zuzugreifen.

Firma -> Kontakt -> Vorgang 1 -> Vorgang 2

Sowohl im Kontakt als auch in beiden Vorgängen, kann nun in Masken und Ansichten der Firmenname angezeigt werden. In den beiden Vorgängen auch der Kontaktname.