Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
Hinweis
Wenn Sie das konzeptionelle Modell erstellen, werden möglicherweise Warnungen zu nicht zugeordneten Entitäten und Assoziationen in der Fehlerliste angezeigt. Sie können diese Warnungen ignorieren, da nach der Auswahl, die Datenbank aus dem Modell zu generieren, die Fehler entfernt werden.
Was ist ein komplexer Typ
Komplexe Typen sind nicht skalare Eigenschaften von Entitätstypen, mit denen skalare Eigenschaften innerhalb von Entitäten organisiert werden können. Wie Entitäten bestehen komplexe Typen aus skalaren Eigenschaften oder anderen komplexen Typeigenschaften.
Wenn Sie mit Objekten arbeiten, die komplexe Typen darstellen, beachten Sie Folgendes:
- Komplexe Typen verfügen nicht über Schlüssel und können daher nicht unabhängig voneinander vorhanden sein. Komplexe Typen können nur als Eigenschaften von Entitätstypen oder anderen komplexen Typen vorhanden sein.
- Komplexe Typen können nicht an Zuordnungen teilnehmen und keine Navigationseigenschaften enthalten.
- Komplexe Typeigenschaften dürfen nicht NULL sein. 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 Designeroberfläche eine oder mehrere Eigenschaften (mit Ausnahme von Navigationseigenschaften) einer Entität aus, klicken Sie dann mit der rechten Maustaste, und wählen Sie " Umgestalten"> aus– "In neuen komplexen Typ verschieben".
Dem Modellbrowser wird ein neuer komplexer Typ mit den ausgewählten Eigenschaften hinzugefügt. Der komplexe Typ erhält einen Standardnamen.
Eine komplexe Eigenschaft des neu erstellten Typs ersetzt die ausgewählten Eigenschaften. Alle Eigenschaftenzuordnungen bleiben erhalten.
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". Alternativ können Sie den Ordner "Komplexe Typen " auswählen und die EINFG-TASTE auf der Tastatur drücken.
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
Eigenschaften eines komplexen Typs können skalare Typen oder vorhandene komplexe Typen sein. Komplexe Typeigenschaften können jedoch keine Zirkelbezüge aufweisen. Beispielsweise kann ein komplexer Typ "OnsiteCourseDetails " keine Eigenschaft vom komplexen Typ "OnsiteCourseDetails" aufweisen.
Sie können einem komplexen Typ eine Eigenschaft auf eine der nachfolgend aufgeführten Weisen hinzufügen.
Klicken Sie im Modellbrowser mit der rechten Maustaste auf einen komplexen Typ, zeigen Sie auf "Hinzufügen", zeigen Sie dann auf "Scalar-Eigenschaft " oder " Komplexe Eigenschaft", und wählen Sie dann den gewünschten Eigenschaftentyp aus. Alternativ können Sie einen komplexen Typ auswählen und dann die Einfügen-Taste auf der Tastatur drücken.
Dem komplexen Typ wird eine neue Eigenschaft mit einem Standardnamen hinzugefügt.
ODER -
Klicken Sie mit der rechten Maustaste auf eine Entitätseigenschaft auf der EF Designer-Oberfläche , 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 ist ausgewählt und im Bearbeitungsmodus.
ODER -
Klicken Sie im Modellbrowser mit der rechten Maustaste auf einen komplexen Typ, und wählen Sie "Umbenennen" aus.
ODER -
Wählen Sie im Modellbrowser einen komplexen Typ aus, und drücken Sie F2.
ODER -
Klicken Sie im Modellbrowser mit der rechten Maustaste auf einen komplexen Typ, und wählen Sie "Eigenschaften" aus. Bearbeiten Sie den Namen im Eigenschaftenfenster .
Hinzufügen eines vorhandenen komplexen Typs zu einer Entität und Zuordnen seiner Eigenschaften zu Tabellenspalten
Klicken Sie mit der rechten Maustaste auf eine Entität, zeigen Sie auf "Neu hinzufügen"; und wählen Sie "Komplexe Eigenschaft" aus. Der Entität wird eine komplexe Typeigenschaft mit einem Standardnamen hinzugefügt. Der Eigenschaft wird ein Standardtyp (ausgewählt aus den vorhandenen komplexen Typen) zugewiesen.
Weisen Sie der Eigenschaft im Eigenschaftenfenster den gewünschten Typ zu. Nachdem Sie einer Entität eine eigenschaft mit komplexem Typ hinzugefügt haben, müssen Sie deren Eigenschaften Tabellenspalten zuordnen.
Klicken Sie mit der rechten Maustaste auf einen Entitätstyp auf der Entwurfsoberfläche oder im Modellbrowser , und wählen Sie "Tabellenzuordnungen" aus. Die Tabellenzuordnungen werden im Fenster "Zuordnungsdetails " angezeigt.
Erweitern Sie den Maps zu <Tabellenname>-Knoten. Ein "Spaltenzuordnungen"-Knoten wird angezeigt.
Erweitern Sie den "Spaltenzuordnungen"-Knoten. Eine Liste aller Spalten in der Tabelle wird angezeigt. Die Standardeigenschaften (sofern vorhanden), denen die Spalten zugeordnet sind, werden unter der Überschrift Wert/Eigenschaft aufgeführt.
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 ". Es wird eine Dropdownliste aller skalaren Eigenschaften angezeigt.
Wählen Sie die entsprechende Eigenschaft aus.
Wiederholen Sie die Schritte 6 und 7 für jede Tabellenspalte.
Hinweis
Um eine Spaltenzuordnung zu löschen, wählen Sie die Spalte aus, die Sie zuordnen möchten, 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, müssen die von der entsprechenden gespeicherten Prozedur zurückgegebenen Spalten mit den Eigenschaften des komplexen Typs in Zahl übereinstimmen und über Speichertypen verfügen, die mit den Eigenschaftentypen kompatibel sind.
Doppelklicken Sie auf eine importierte Funktion, die Einem komplexen Typ zugeordnet werden soll.
Geben Sie die Einstellungen für den Import der neuen Funktion wie folgt ein:
Geben Sie die gespeicherte Prozedur an, für die Sie einen Funktionsimport im Feld " Name der gespeicherten Prozedur " erstellen. Dieses Feld ist eine Dropdownliste, in der alle gespeicherten Prozeduren im Speichermodell angezeigt werden.
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 spezifischen komplexen Rückgabetyp an, indem Sie den entsprechenden Typ aus der Dropdownliste auswählen.
Klicke auf OK. Der Funktionsimporteintrag 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 die Funktionsimportzuordnung aus. Das Fenster "Zuordnungsdetails " wird angezeigt und zeigt die Standardzuordnung für den Funktionsimport an. Pfeile geben die Zuordnungen zwischen Spaltenwerten und Eigenschaftswerten an. Standardmäßig werden die Spaltennamen als identisch mit den Eigenschaftennamen des komplexen Typs angenommen. Die Standardspaltennamen werden in grauen Text angezeigt.
- Ändern Sie bei Bedarf die Spaltennamen so, dass sie den Spaltennamen entsprechen, 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 Zuordnungen für alle Instanzen des Typs werden gelöscht. Verweise auf den Typ werden jedoch nicht aktualisiert. Wenn beispielsweise eine Entität eine komplexe Typeigenschaft vom Typ ComplexType1 aufweist 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. Sie können Verweise auf gelöschte komplexe Typen mithilfe des Entity Designer aktualisieren oder löschen.
Klicken Sie im Modellbrowser mit der rechten Maustaste auf einen komplexen Typ, und wählen Sie "Löschen" aus.
ODER -
Wählen Sie im Modellbrowser einen komplexen Typ aus, und drücken Sie 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 Auflistung 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);
}
}