Komplexe Typen – EF Designer

In diesem Thema wird gezeigt, wie komplexe Typen mit dem Entity Framework Designer (EF Designer) zugeordnet werden und wie Sie Entitäten abfragen, die Eigenschaften von komplexem Typ enthalten.

Die folgende Abbildung zeigt die Hauptfenster, die beim Arbeiten mit dem EF Designer verwendet werden.

EF Designer

Hinweis

Beim Erstellen des konzeptionellen Modells können Warnungen zu nicht zugeordneten Entitäten und Zuordnungen in der Fehlerliste angezeigt werden. Sie können diese Warnungen ignorieren, da nach der Auswahl, die Datenbank aus dem Modell zu generieren, die Fehler nicht mehr auftreten.

Was ist ein komplexer Typ

Komplexe Typen sind nicht skalare Eigenschaften von Entitätstypen, mit deren Hilfe skalare Eigenschaften in Entitäten organisiert werden können. Wie Entitäten bestehen komplexe Typen aus skalaren Eigenschaften oder anderen Eigenschaften von komplexem Typ.

Wenn Sie mit Objekten arbeiten, die komplexe Typen darstellen, beachten Sie Folgendes:

  • Komplexe Typen weisen keine Schlüssel auf und können daher nicht unabhängig sein. Komplexe Typen können nur Eigenschaften von Entitätstypen oder anderen komplexen Typen sein.
  • Komplexe Typen können nicht an Zuordnungen teilnehmen und keine Navigationseigenschaften enthalten.
  • Die Eigenschaften von komplexen Typen können nicht den Wert NULL haben. Eine **InvalidOperationException **tritt auf, wenn DbContext.SaveChanges aufgerufen wird und ein komplexes Null-Objekt gefunden wird. Skalare Eigenschaften komplexer Objekte können NULL sein.
  • Komplexe Typen können nicht von anderen komplexen Typen erben.
  • Sie müssen den komplexen Typ als Klasse definieren. 
  • EF erkennt Änderungen an Elementen in einem komplexen Typobjekt, wenn DbContext.DetectChanges aufgerufen wird. Entity Framework ruft DetectChanges automatisch auf, wenn die folgenden Member aufgerufen werden: DbSet.Find, DbSet.Local, DbSet.Remove, DbSet.Add, DbSet.Attach, DbContext.SaveChanges, DbContext.GetValidationErrors, DbContext.Entry, DbChangeTracker.Entries.

Umgestalten der Eigenschaften einer Entität in neuen komplexen Typ

Wenn Sie bereits über eine Entität in Ihrem konzeptionellen Modell verfügen, sollten Sie einige der Eigenschaften in eine komplexe Typeigenschaft umgestalten.

Wählen Sie auf der Designer-Oberfläche mindestens eine Eigenschaft einer Entität aus (keine Navigationseigenschaften), klicken Sie dann mit der rechten Maustaste, und wählen Sie Umgestalten -> Verschieben in einen neuen komplexen Typ.

Refactor Into New Complex Type

Ein neuer komplexer Typ mit den ausgewählten Eigenschaften wird dem Modellbrowser hinzugefügt. Dem komplexen Typ wird ein Standardname zugewiesen.

Die ausgewählten Eigenschaften werden durch eine komplexe Eigenschaft des neu erstellten Typs ersetzt. Alle Eigenschaftenzuordnungen werden beibehalten.

Refactor Into New Complex Type 2

Erstellen eines neuen komplexen Typs

Sie können auch einen neuen komplexen Typ erstellen, der keine Eigenschaften einer vorhandenen Entität enthält.

Klicken Sie im Modellbrowser mit der rechten Maustaste auf den Ordner Komplexe Typen und zeigen Sie auf Komplexen Typ hinzufügen…. Markieren Sie ialternativ den Ordner Komplexe Typen, und drücken Sie die EINFG-TASTE auf der Tastatur.

Add New Complex type

Dem Ordner wird ein neuer komplexer Typ mit einem Standardnamen hinzugefügt. Sie können dem Typ nun Eigenschaften hinzufügen.

Hinzufügen von Eigenschaften zu einem komplexen Typ

Bei den Eigenschaften eines komplexen Typs kann es sich um skalare Typen oder vorhandene komplexe Typen handeln. Für die Eigenschaften eines komplexen Typs können jedoch keine Zirkelverweise verwendet werden. Beispielsweise kann ein komplexer Typ OnsiteCourseDetails keine Eigenschaft vom komplexen Typ OnsiteCourseDetailshaben aufweisen.

Einem komplexen Typ können anhand der unten aufgeführten Methoden Eigenschaften hinzugefügt werden.

  • Klicken Sie im Modellbrowser mit der rechten Maustaste auf einen komplexen Typ, zeigen Sie auf Hinzufügen und dann auf Skalareigenschaft oder Komplexe Eigenschaft, und wählen Sie den gewünschten Eigenschaftentyp aus. Alternativ können Sie einen komplexen Typ auswählen und dann die EINFG-TASTE auf der Tastatur drücken.

    Add Properties to Complex Type

    Dem komplexen Typ wird eine neue Eigenschaft mit einem Standardnamen hinzugefügt.

  • - ODER -

  • Klicken Sie auf der EF Designer-Oberfläche mit der rechten Maustaste auf eine Entitätseigenschaft, und wählen Sie Kopieren aus. Klicken Sie dann im Modellbrowser mit der rechten Maustaste auf den komplexen Typ, und wählen Sie Einfügen aus.

Umbenennen eines komplexen Typs

Wenn Sie einen komplexen Typ umbenennen, werden alle Verweise auf den Typ im gesamten Projekt aktualisiert.

  • Doppelklicken Sie im Modellbrowser langsam auf einen komplexen Typ. Der Name wird markiert und kann bearbeitet werden.

  • - ODER -

  • Klicken Sie im Modellbrowser mit der rechten Maustaste auf einen komplexen Typ, und wählen Sie Umbenennen aus.

  • - ODER -

  • Markieren Sie im Modellbrowser einen komplexen Typ, und drücken Sie die F2-TASTE.

  • - ODER -

  • Klicken Sie im Modellbrowser mit der rechten Maustaste auf einen komplexen Typ, und wählen Sie Eigenschaften aus. Bearbeiten Sie den Namen im Fenster Eigenschaften.

Hinzufügen eines vorhandenen komplexen Typs zu einer Entität und Zuordnen seiner Eigenschaften zu Tabellenspalten

  1. Klicken Sie mit der rechten Maustaste auf eine Entität, zeigen Sie auf Neue hinzufügen, und wählen Sie Komplexe Eigenschaft aus. Der Entität wird eine Eigenschaft eines komplexen Typs mit einem Standardnamen hinzugefügt. Der Eigenschaft wird ein Standardtyp zugewiesen (ausgewählt aus den vorhandenen komplexen Typen).

  2. Weisen Sie der Eigenschaft im Fenster Eigenschaften den gewünschten Typ zu. Nachdem Sie einer Entität eine Eigenschaft eines komplexen Typs hinzugefügt haben, müssen Sie die zugehörigen Eigenschaften Tabellenspalten zuordnen.

  3. Klicken Sie auf der Entwurfsoberfläche oder im Modellbrowser mit der rechten Maustaste auf einen Entitätstyp, und wählen Sie Tabellenzuordnungen aus. Die Tabellenzuordnungen werden im Fenster Zuordnungsdetails angezeigt.

  4. Erweitern Sie den Knoten Zuordnungen zu <Tabellennamen>. Ein Knoten Spaltenzuordnungen wird angezeigt.

  5. Erweitern Sie den Knoten Spaltenzuordnungen. Eine Liste aller Spalten in der Tabelle wird angezeigt. Gegebenenfalls werden die Standardeigenschaften, denen die Spalten zugeordnet werden, unter der Überschrift Wert/Eigenschaft aufgeführt.

  6. Wählen Sie die Spalte aus, die Sie zuordnen möchten, und klicken Sie dann mit der rechten Maustaste auf das entsprechende Feld Wert/Eigenschaft. Eine Dropdownliste aller skalaren Eigenschaften wird angezeigt.

  7. Wählen Sie die entsprechende Eigenschaft aus.

    Map Complex Type

  8. Wiederholen Sie die Schritte 6 und 7 für jede Tabellenspalte.

Hinweis

Um eine Spalte zu löschen, wählen Sie die zuzuordnende Spalte aus, und klicken Sie dann auf das Feld Wert/Eigenschaft. Wählen Sie dann in der Dropdownliste Löschen aus.

Zuordnen eines Funktionsimports zu einem komplexen Typ

Funktionsimporte basieren auf gespeicherten Prozeduren. Um einen Funktionsimport einem komplexen Typ zuzuordnen, muss die Zahl der von der entsprechenden gespeicherten Prozedur zurückgegebenen Spalten der Zahl der Eigenschaften des komplexen Typs entsprechen, und die Spalten müssen einen Speichertyp aufweisen, der mit den Typen der Eigenschaften kompatibel ist.

  • Doppelklicken Sie auf eine importierte Funktion, die einem komplexen Typ zugeordnet werden soll.

    Function Imports

  • Geben Sie wie folgt die Einstellungen für den neuen Funktionsimport ein:

    • Geben Sie im Feld Name der gespeicherten Prozedur die gespeicherte Prozedur an, für die Sie einen Funktionsimport erstellen. Dieses Feld wird als Dropdownliste angezeigt, die alle gespeicherten Prozeduren im Speichermodell enthält.

    • Geben Sie den Namen des Funktionsimports im Feld Name des Funktionsimports an.

    • Wählen Sie Komplex als Rückgabetyp aus, und geben Sie dann den speziellen komplexen Rückgabetyp an, indem Sie den entsprechenden Typ aus der Dropdownliste auswählen.

      Edit Function Import

  • Klicken Sie auf OK. Der Funktionsimport-Eintrag wird im konzeptionellen Modell erstellt.

Anpassen der Spaltenzuordnung für den Funktionsimport

  • Klicken Sie im Modellbrowser mit der rechten Maustaste auf den Funktionsimport, und wählen Sie Zuordnung des Funktionsimports aus. Das Fenster Zuordnungsdetails wird mit der Standardzuordnung für den Funktionsimport angezeigt. Pfeilsymbole geben die Zuordnungen der Spaltenwerte zu den Eigenschaftswerten an. Standardmäßig wird angenommen, dass die Spaltennamen mit den Namen der Eigenschaften des komplexen Typs identisch sind. Die Standardspaltennamen werden in grauem Text angezeigt.
  • Ändern Sie, falls erforderlich, die Spaltennamen so, dass sie mit den Spaltennamen übereinstimmen, die von der gespeicherten Prozedur zurückgegeben werden, die dem Funktionsimport entspricht.

Löschen eines komplexen Typs

Wenn Sie einen komplexen Typ löschen, wird der Typ aus dem konzeptionellen Modell gelöscht, und die Mappings für alle Instanzen des Typs werden gelöscht. Verweise auf den Typ werden jedoch nicht aktualisiert. Wenn eine Entität z. B. über eine Eigenschaft eines komplexen Typs ComplexType1 verfügt und ComplexType1 im Modellbrowser gelöscht wird, wird die entsprechende Entitätseigenschaft nicht aktualisiert. Das Modell wird nicht überprüft, da es eine Entität enthält, die auf einen gelöschten komplexen Typ verweist. Verweise auf gelöschte komplexe Typen können mit dem Entity Designer aktualisiert werden.

  • Klicken Sie im Modellbrowser mit der rechten Maustaste auf einen komplexen Typ, und wählen Sie Löschen aus.

  • - ODER -

  • Markieren Sie im Modellbrowser einen komplexen Typ, und drücken Sie dann die ENTF-TASTE auf der Tastatur.

Abfrage nach Entitäten, die Eigenschaften des komplexen Typs enthalten

Der folgende Code zeigt, wie eine Abfrage ausgeführt wird, die eine Sammlung von Entitätstypobjekten zurückgibt, die eine komplexe Typeigenschaft enthalten.

    using (SchoolEntities context = new SchoolEntities())
    {
        var courses =
            from c in context.OnsiteCourses
            order by c.Details.Time
            select c;

        foreach (var c in courses)
        {
            Console.WriteLine("Time: " + c.Details.Time);
            Console.WriteLine("Days: " + c.Details.Days);
            Console.WriteLine("Location: " + c.Details.Location);
        }
    }