Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Relationen können über den ClassBuilder hinzugefügt werden. Der RelationBuilder erstellt dabei eine Relation von x → y und entsprechend von y → x.

Eine einfache Relation kann wie folgt erstellt werden:

Code Block
Elements.Company.Add.Relation(AssociationType.OneToMany, Elements.Person) 
  .Description(English, "The company of the person")
  .Description(German, "Die Firma der Person");

Das führt zu folgendem Ergebnis auf der Datenbank:

...

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.

Eine Relation mit erweiterter Konfiguration kann wie folgt aussehen:

Code Block
breakoutModewide
Builder.Add.Relation(Elements.Company, AssociationType.ZeroOrOneToMany, Elements.Office, MetaPathRule.Cascade)
  .Caption(SwissGerman, "Büros")
  .InverseCaption(SwissGerman, "Firma")
  .Control(nameof(ControlType.GridEditor))
  .InverseControl(nameof(ControlType.SearchEdit))
  .InverseLayout(LayoutType.Detail, "CompactLayout")
  .Rename("Offices");

Einzelne Elemente einer Relation können auch über einen callback konfiguriert werden:

Code Block
breakoutModewide
Builder.Add.Relation(Elements.Company, AssociationType.ZeroOrOneToMany, Elements.Office, MetaPathRule.Cascade)
  .Configure(tuple =>
  {
    // tuple.relation;
    // tuple.inverseRelation;
    // tuple.foreignKey;
    // tuple.path;
    // tuple.index;
  });

Werden mehrere Relationen von einer Klasse zur nächsten gelegt so müssen diese mit einem Prefix ausgezeichnet werden.

Code Block
breakoutModewide
Elements.Company.Add.Relation(AssociationType.OneToMany, Elements.Person)
  .Description(English, "The company of the person")
  .Description(German, "Die Firma der Person");

Elements.Company.Add.Relation(AssociationType.ZeroOrOneToMany, Elements.Person, sourceNamePrefix: "CompanyPrefix", inverseNamePrefix: "PersonPrefix")
  .Description(English, "The company of the person")
  .Description(German, "Die Firma der Person");

Dies führt zu vier Relationen:

  • Eine Relation mit dem Namen People von Company => Person

  • Eine Relation mit dem Namen CompanyPrefixPeople von Company => Person

  • Eine Relation mit dem Namen Company von Person => Company

  • Eine Relation mit dem Namen PersonPrefixCompany von Person => Company

Eine Relation kann im DB-First Modus auch auf einen bestehenden ForeignKey gesetzt werden. Dazu steht ein zusätzlicher Parameter zur Verfügung. Der FK muss bereits als Property modelliert sein damit die Relation erstellt werden kann.

Code Block
breakoutModewide
Elements.Company.Add.Relation(AssociationType.ZeroOrOneToMany, Elements.Person, foreignKey: "ExistingFK")
        .Description(English, "The company of the person")
        .Description(German, "Die Firma der Person");

Auf dem Relation Builder stehen verschiedene Methoden zur Verfügung womit die Relation weiter verfeinert werden kann. Die Methoden stehen jeweils mit einem “Inverse” Prefix zur Verfügung.

  • 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.