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()
    {
        RelationTypeConfiguration relationConfiguration = new RelationTypeConfiguration()
        {
            Id = EnumRelationTypeExtension.MyRelation,
            Type = EnumRelationCardinality.AnythingToAnythingGuid,
        };

        relationConfiguration.Initialize();

        relationConfiguration.ConfigurationName = "My Relation";
        relationConfiguration.Description = "My Relation";
        relationConfiguration.ShowInDesigner = true;

        return relationConfiguration;
    }
}

EnumRelationCardinality

Der RelationTypeConfiguration.Type definiert, zwischen welchen Datentabellen eine Relation dieses Typs erstellt werden kann.

AnythingToAnything

Bedeutet das sowohl alle Datentabellen als Quellen als auch als Ziele verwendet werden können.

SomethingToAnything

Bedeutet, dass als Quelle nur bestimmte Datentabellen genutzt werden können aber als Ziele alle. In diesem Fall muss für die in Frage kommenden Quellen noch folgende Zeilen der Relation nach der Initialisierung hinzugefügt werden. Falls als Betreuer nur Benutzer in Frage kommen, fügt man dies hinzu.

relationConfiguration.SourceTypes.Add(EnumDataSource.UserProfileGuid);

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.

relationConfiguration.SourceTypes.Add(EnumDataSource.RoleBaseGuid);

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

relationConfiguration.SourceTypes.Add(EnumDataSource.UserProfileGuid);
relationConfiguration.SourceTypes.Add(EnumDataSourceExtension.ContactGuid);

AnythingToSomething

Bedeutet das als Quelle alle Datentabellen genutzt werden können aber als Ziele nur bestimmte. In diesem Fall muss für die in Frage kommenden Ziele noch folgende Zeile der Relation nach der Initialisierung hinzugefügt werden. Falls die Betreuer nur Firmen betreuen können, fügt man dies hinzu.

relationConfiguration.TargetTypes.Add(EnumDataSourceExtension.CompanyGuid);

Wie im vorherigen Abschnitt können auch Basis-Datentabellen oder mehrere Datentabellen gesetzt werden.

SomethingToSomething

Wenn sowohl die Quell-Datentabellen als auch die Ziel-Datentabellen bestimmte sein sollen, werden sowohl die Quellen als auch die Ziele konkret gesetzt. Beispielsweise der Betreuer einer Firma.

relationConfiguration.SourceTypes.Add(EnumDataSource.UserProfileGuid);
relationConfiguration.TargetTypes.Add(EnumDataSourceExtension.CompanyGuid);

Auch in diesem Fall können Basis-Datentabellen oder mehrere Datentabellen sowohl als Quelle als auch als Ziel 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.