Komplexe Typen: EF-DesignerComplex Types - EF Designer

In diesem Thema wird gezeigt, wie komplexe Typen mit dem Entity Framework Designer (EF-Designer) zugeordnet werden und wie Entitäten abgefragt werden, die Eigenschaften des komplexen Typs enthalten.This topic shows how to map complex types with the Entity Framework Designer (EF Designer) and how to query for entities that contain properties of complex type.

Die folgende Abbildung zeigt die Hauptfenster, die bei der Arbeit mit dem EF-Designer verwendet werden.The following image shows the main windows that are used when working with the EF Designer.

EF-Designer

Hinweis

Beim Erstellen des konzeptionellen Modells können Warnungen zu nicht zugeordneten Entitäten und Zuordnungen in der Fehlerliste angezeigt werden.When you build the conceptual model, warnings about unmapped entities and associations may appear in the Error List. Sie können diese Warnungen ignorieren, da die Fehler nach dem Generieren der Datenbank aus dem Modell entfernt werden.You can ignore these warnings because after you choose to generate the database from the model, the errors will go away.

Was ist ein komplexer Typ?What is a Complex Type

Komplexe Typen sind nicht skalare Eigenschaften von Entitätstypen, mit deren Hilfe skalare Eigenschaften in Entitäten organisiert werden können.Complex types are non-scalar properties of entity types that enable scalar properties to be organized within entities. Wie Entitäten bestehen komplexe Typen aus skalaren Eigenschaften oder anderen Eigenschaften von komplexem Typ.Like entities, complex types consist of scalar properties or other complex type properties.

Beachten Sie Folgendes, wenn Sie mit Objekten arbeiten, die komplexe Typen darstellen:When you work with objects that represent complex types, be aware of the following:

  • Komplexe Typen verfügen über keine Schlüssel und können daher nicht unabhängig vorhanden sein.Complex types do not have keys and therefore cannot exist independently. Komplexe Typen können nur Eigenschaften von Entitätstypen oder anderen komplexen Typen sein.Complex types can only exist as properties of entity types or other complex types.
  • Komplexe Typen können nicht an Zuordnungen teilnehmen und keine Navigations Eigenschaften enthalten.Complex types cannot participate in associations and cannot contain navigation properties.
  • Eigenschaften komplexer Typen dürfen nicht nullsein.Complex type properties cannot be null. Eine **InvalidOperationException **tritt auf, wenn dbcontext. SaveChanges   aufgerufen wird und ein komplexes NULL-Objekt gefunden wird.An **InvalidOperationException **occurs when DbContext.SaveChanges is called and a null complex object is encountered. Skalare Eigenschaften komplexer Objekte können nullsein.Scalar properties of complex objects can be null.
  • Komplexe Typen können nicht von anderen komplexen Typen erben.Complex types cannot inherit from other complex types.
  • Sie müssen den komplexen Typ als Klassedefinieren.You must define the complex type as a class. 
  • EF erkennt Änderungen an Membern für ein Objekt komplexer Typen, wenn dbcontext. DetectChanges aufgerufen wird.EF detects changes to members on a complex type object when DbContext.DetectChanges is called. 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.Entity Framework calls DetectChanges automatically when the following members are called: 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 einen neuen komplexen TypRefactor an Entity’s Properties into New Complex Type

Wenn Sie bereits über eine Entität im konzeptionellen Modell verfügen, können Sie einige der Eigenschaften in eine komplexe Typeigenschaft umgestalten.If you already have an entity in your conceptual model you may want to refactor some of the properties into a complex type property.

Wählen Sie auf der Designer Oberfläche eine oder mehrere Eigenschaften (mit Ausnahme der Navigations Eigenschaften) einer Entität aus, klicken Sie dann mit der rechten Maustaste, und wählen Sie umgestalten- > in neuen komplexen Typ verschiebenaus.On the designer surface, select one or more properties (excluding navigation properties) of an entity, then right-click and select Refactor -> Move to New Complex Type.

Umgestalten in neuen komplexen Typ

Ein neuer komplexer Typ mit den ausgewählten Eigenschaften wird dem Modell Browserhinzugefügt.A new complex type with the selected properties is added to the Model Browser. Dem komplexen Typ wird ein Standardname zugewiesen.The complex type is given a default name.

Die ausgewählten Eigenschaften werden durch eine komplexe Eigenschaft des neu erstellten Typs ersetzt.A complex property of the newly created type replaces the selected properties. Alle Eigenschaftenzuordnungen werden beibehalten.All property mappings are preserved.

Umgestalten in den neuen komplexen Typ 2

Neuen komplexen Typ erstellenCreate a New Complex Type

Sie können auch einen neuen komplexen Typ erstellen, der keine Eigenschaften einer vorhandenen Entität enthält.You can also create a new complex type that does not contain properties of an existing entity.

Klicken Sie im Modell Browser mit der rechten Maustaste auf den Ordner Complex Types , und zeigen Sie auf AddNew Complex Type....Right-click the Complex Types folder in the Model Browser, point to AddNew Complex Type…. Alternativ können Sie den Ordner komplexe Typen auswählen und die Einfügetaste   auf der Tastatur drücken.Alternatively, you can select the Complex Types folder and press the Insert key on your keyboard.

Neuen komplexen Typ hinzufügen

Dem Ordner wird ein neuer komplexer Typ mit einem Standardnamen hinzugefügt.A new complex type is added to the folder with a default name. Sie können dem Typ jetzt Eigenschaften hinzufügen.You can now add properties to the type.

Hinzufügen von Eigenschaften zu einem komplexen TypAdd Properties to a Complex Type

Bei den Eigenschaften eines komplexen Typs kann es sich um skalare Typen oder vorhandene komplexe Typen handeln.Properties of a complex type can be scalar types or existing complex types. Für die Eigenschaften eines komplexen Typs können jedoch keine Zirkelverweise verwendet werden.However, complex type properties cannot have circular references. Beispielsweise kann ein komplexer Typ " onsitecourtendetails"   keine Eigenschaft des komplexen Typs " onsitecourtendetails" aufweisen.For example, a complex type OnsiteCourseDetails cannot have a property of complex type OnsiteCourseDetails.

Einem komplexen Typ können anhand der unten aufgeführten Methoden Eigenschaften hinzugefügt werden.You can add a property to a complex type in any of the ways listed below.

  • Klicken Sie im Modell Browser mit der rechten Maustaste auf einen komplexen Typ, zeigen Sie auf Hinzufügen, zeigen Sie auf skalare Eigenschaft   oder komplexe Eigenschaft, und wählen Sie dann den gewünschten Eigenschaftentyp aus.Right-click a complex type in the Model Browser, point to Add, then point to Scalar Property or Complex Property, then select the desired property type. Alternativ können Sie einen komplexen Typ auswählen und dann die Einfügetaste   auf der Tastatur drücken.Alternatively, you can select a complex type and then press the Insert key on your keyboard.

    Hinzufügen von Eigenschaften zu einem komplexen Typ

    Dem komplexen Typ wird eine neue Eigenschaft mit einem Standardnamen hinzugefügt.A new property is added to the complex type with a default name.

  • - ODER -OR -

  • Klicken Sie mit der rechten Maustaste auf eine Entitäts Eigenschaft auf der EF-Designer -Oberfläche, und wählen Sie Kopieren aus. Klicken Sie dannmit der rechten Maustaste auf den komplexen Typ im Modell BrowserRight-click an entity property on the EF  Designer surface and select Copy, then right-click the complex type in the Model Browser and select Paste.

Umbenennen eines komplexen TypsRename a Complex Type

Wenn Sie einen komplexen Typ umbenennen, werden alle Verweise auf den Typ im gesamten Projekt aktualisiert.When you rename a complex type, all references to the type are updated throughout the project.

  • Doppelklicken Sie im Modell Browserlangsam auf einen komplexen Typ.Slowly double-click a complex type in the Model Browser. Der Name wird markiert und kann bearbeitet werden.The name will be selected and in edit mode.

  • - ODER -OR -

  • Klicken Sie im Modell Browser mit der rechten Maustaste auf einen komplexen Typ, und wählen Sie Umbenennen.Right-click a complex type in the Model Browser and select Rename.

  • - ODER -OR -

  • Markieren Sie im Modellbrowser einen komplexen Typ, und drücken Sie die F2-TASTE.Select a complex type in the Model Browser and press the F2 key.

  • - ODER -OR -

  • Klicken Sie im Modell Browser mit der rechten Maustaste auf einen komplexen Typ, und wählen Sie Eigenschaftenaus.Right-click a complex type in the Model Browser and select Properties. Bearbeiten Sie den Namen im Eigenschaften   Fenster.Edit the name in the Properties window.

Fügen Sie einer Entität einen vorhandenen komplexen Typ hinzu, und ordnen Sie die zugehörigen Eigenschaften Tabellen Spalten zu.Add an Existing Complex Type to an Entity and Map its Properties to Table Columns

  1. Klicken Sie mit der rechten Maustaste auf eine Entität, zeigen Sie auf Neu hinzufügen, und wählen Sie komplexe EigenschaftRight-click an entity, point to Add New, and select Complex Property. Der Entität wird eine Eigenschaft eines komplexen Typs mit einem Standardnamen hinzugefügt.A complex type property with a default name is added to the entity. Der Eigenschaft wird ein Standardtyp zugewiesen (ausgewählt aus den vorhandenen komplexen Typen).A default type (chosen from the existing complex types) is assigned to the property.

  2. Weisen Sie der-Eigenschaft im EigenschaftenFenster den gewünschten Typ zu   .Assign the desired type to the property in the Properties window. Nachdem Sie einer Entität eine Eigenschaft eines komplexen Typs hinzugefügt haben, müssen Sie die zugehörigen Eigenschaften Tabellenspalten zuordnen.After adding a complex type property to an entity, you must map its properties to table columns.

  3. Klicken Sie in der Entwurfs Oberfläche oder im Modell Browsermit der rechten Maustaste auf einen Entitätstyp,   und wählen Sie TabellenZuordnungen aus.Right-click an entity type on the design surface or in the Model Browser and select Table Mappings. Die Tabellen Zuordnungen werden im Fenster Mappingdetailsangezeigt   .The table mappings are displayed in the Mapping Details window.

  4. Erweitern Sie den Knoten **maps to < Table Name > **   .Expand the Maps to <Table Name> node. Ein Knoten SpaltenZuordnungen wird   angezeigt.Column Mappings node appears.

  5. Erweitern Sie den Knoten SpaltenZuordnungen   .Expand the Column Mappings node. Eine Liste aller Spalten in der Tabelle wird angezeigt.A list of all the columns in the table appears. Die Standardeigenschaften (sofern vorhanden), denen die Spalten zugeordnet sind, werden unter der Überschrift Wert/Eigenschaftaufgelistet   .The default properties (if any) to which the columns map are listed under the Value/Property heading.

  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   .Select the column you want to map, and then right-click the corresponding Value/Property field. Eine Dropdownliste aller skalaren Eigenschaften wird angezeigt.A drop-down list of all the scalar properties is displayed.

  7. Wählen Sie die entsprechende Eigenschaft aus.Select the appropriate property.

    Komplexer Kartentyp

  8. Wiederholen Sie die Schritte 6 und 7 für jede Tabellenspalte.Repeat steps 6 and 7 for each table column.

Hinweis

Um eine Spalten Zuordnung zu löschen, wählen Sie die Spalte aus, die Sie zuordnen möchten, und klicken Sie dann auf das Feld Wert/Eigenschaft   .To delete a column mapping, select the column that you want to map, and then click the Value/Property field. Wählen Sie dann in der Dropdown Liste die Option Löschen aus.Then, select Delete from the drop-down list.

Zuordnen eines Funktions Imports zu einem komplexen TypMap a Function Import to a Complex Type

Funktionsimporte basieren auf gespeicherten Prozeduren.Function imports are based on stored procedures. 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.To map a function import to a complex type, the columns returned by the corresponding stored procedure must match the properties of the complex type in number and must have storage types that are compatible with the property types.

  • Doppelklicken Sie auf eine importierte Funktion, die einem komplexen Typ zugeordnet werden soll.Double-click on an imported function that you want to map to a complex type.

    Funktions Importe

  • Geben Sie wie folgt die Einstellungen für den neuen Funktionsimport ein:Fill in the settings for the new function import, as follows:

    • Geben Sie im Feld Name der gespeicherten Prozedurdie gespeicherte Prozedur an, für die Sie einen Funktions Import erstellen   .Specify the stored procedure for which you are creating a function import in the Stored Procedure Name field. Dieses Feld wird als Dropdownliste angezeigt, die alle gespeicherten Prozeduren im Speichermodell enthält.This field is a drop-down list that displays all the stored procedures in the storage model.

    • Geben Sie den Namen des Funktions Imports im Feld Funktions Import Namean   .Specify the name of the function import in the Function Import Name field.

    • 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 Dropdown Liste auswählen.Select Complex as the return type and then specify the specific complex return type by choosing the appropriate type from the drop-down list.

      Funktions Import bearbeiten

  • Klicken Sie auf OK.Click OK. Der Funktionsimport-Eintrag wird im konzeptionellen Modell erstellt.The function import entry is created in the conceptual model.

Anpassen der Spalten Zuordnung für den Funktions ImportCustomize Column Mapping for Function Import

  • Klicken Sie im Modell Browser mit der rechten Maustaste auf den Funktions Import, und wählen Sie Funktions Import Zuordnungaus.Right-click the function import in the Model Browser and select Function Import Mapping. Das Fenster Mappingdetailswird   angezeigt und zeigt die Standard Zuordnung für den Funktions Import an.The Mapping Details window appears and shows the default mapping for the function import. Pfeilsymbole geben die Zuordnungen der Spaltenwerte zu den Eigenschaftswerten an.Arrows indicate the mappings between column values and property values. Standardmäßig wird angenommen, dass die Spaltennamen mit den Namen der Eigenschaften des komplexen Typs identisch sind.By default, the column names are assumed to be the same as the complex type's property names. Die Standardspaltennamen werden in grauem Text angezeigt.The default column names appear in gray text.
  • Ä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.If necessary, change the column names to match the column names that are returned by the stored procedure that corresponds to the function import.

Löschen eines komplexen TypsDelete a Complex Type

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.When you delete a complex type, the type is deleted from the conceptual model and mappings for all instances of the type are deleted. Verweise auf den Typ werden jedoch nicht aktualisiert.However, references to the type are not updated. Wenn eine Entität z. b. über eine komplexe Typeigenschaft vom Typ ComplexType1 und ComplexType1 im Modell Browsergelöscht wird, wird die zugehörige Entitäts Eigenschaft nicht aktualisiert.For example, if an entity has a complex type property of type ComplexType1 and ComplexType1 is deleted in the Model Browser, the corresponding entity property is not updated. Das Modell wird nicht überprüft, weil es eine Entität enthält, die auf einen gelöschten komplexen Typ verweist.The model will not validate  because it contains an entity that references a deleted complex type. Verweise auf gelöschte komplexe Typen können mit dem Entity Designer aktualisiert werden.You can update or delete references to deleted complex types by using the Entity Designer.

  • Klicken Sie im Modell Browser mit der rechten Maustaste auf einen komplexen Typ, und wählen Sie Löschenaus.Right-click a complex type in the Model Browser and select Delete.

  • - ODER -OR -

  • Markieren Sie im Modellbrowser einen komplexen Typ, und drücken Sie dann die ENTF-TASTE auf der Tastatur.Select a complex type in the Model Browser and press the Delete key on your keyboard.

Abfragen von Entitäten mit Eigenschaften des komplexen TypsQuery for Entities Containing Properties of Complex Type

Der folgende Code zeigt, wie eine Abfrage ausgeführt wird, die eine Auflistung von Entitätstyp Objekten zurückgibt, die eine Eigenschaft eines komplexen Typs enthalten.The following code shows how to execute a query that returns a collection of entity type objects that contain a complex type property.

    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);
        }
    }