Tipi complessi - Ef Designer

Questo argomento illustra come eseguire il mapping di tipi complessi con Entity Framework Designer (EF Designer) e come eseguire query per le entità che contengono proprietà di tipo complesso.

L'immagine seguente mostra le finestre principali usate quando si lavora con Entity Framework Designer.

EF Designer

Nota

Quando si compila il modello concettuale, gli avvisi relativi a entità e associazioni non mappate possono essere visualizzati nell'elenco errori. È possibile ignorare questi avvisi perché dopo aver scelto di generare il database dal modello, gli errori verranno ignorati.

Che cos'è un tipo complesso

I tipi complessi sono proprietà non scalari di tipi di entità che consentono l'organizzazione delle proprietà scalari nelle entità. Analogamente alle entità, i tipi complessi sono costituiti da proprietà scalari o da altre proprietà dei tipi complessi.

Quando si lavora con oggetti che rappresentano tipi complessi, tenere presente quanto segue:

  • I tipi complessi non dispongono di chiavi e pertanto non possono esistere in modo indipendente. I tipi complessi possono esistere solo come proprietà di tipi di entità o gli altri tipi complessi.
  • I tipi complessi non possono partecipare alle associazioni e non possono contenere proprietà di navigazione.
  • Le proprietà dei tipi complessi non possono essere Null. **InvalidOperationException **si verifica quando viene chiamato DbContext.SaveChanges e viene rilevato un oggetto complesso Null. Le proprietà scalari di oggetti complessi possono essere Null.
  • I tipi complessi non possono ereditare da altri tipi complessi.
  • È necessario definire il tipo complesso come classe
  • Ef rileva le modifiche apportate ai membri in un oggetto di tipo complesso quando viene chiamato DbContext.DetectChanges . Entity Framework chiama automaticamente DetectChanges quando vengono chiamati i membri seguenti: DbSet.Find, DbSet.Local, DbSet.Remove, DbSet.Add, DbSet.Attach, DbContext.SaveChanges, DbContext.GetValidationErrors, DbContext.Entry, DbChangeTracker.Entries.

Eseguire il refactoring delle proprietà di un'entità in un nuovo tipo complesso

Se si dispone già di un'entità nel modello concettuale, è possibile effettuare il refactoring di alcune delle proprietà in una proprietà di tipo complesso.

Nell'area di progettazione selezionare una o più proprietà (escluse le proprietà di navigazione) di un'entità, quindi fare clic con il pulsante destro del mouse e scegliere Refactoring -> Sposta in Nuovo tipo complesso.

Refactor Into New Complex Type

Un nuovo tipo complesso con le proprietà selezionate viene aggiunto al Browser modelli. Al tipo complesso viene assegnato un nome predefinito.

Una proprietà complessa del tipo appena creato sostituisce le proprietà selezionate. Tutti i mapping delle proprietà vengono mantenuti.

Refactor Into New Complex Type 2

Creare un nuovo tipo complesso

È anche possibile creare un nuovo tipo complesso che non contiene proprietà di un'entità esistente.

Fare clic con il pulsante destro del mouse sulla cartella Tipi complessi nel Browser modelli, scegliere AggiungiNuovo tipo complesso. In alternativa, è possibile selezionare la cartella Tipi complessi e premere il tasto Inserisci sulla tastiera.

Add New Complex type

Un nuovo tipo complesso verrà aggiunto nella cartella con un nome predefinito. È ora possibile aggiungere proprietà al tipo.

Aggiungere proprietà a un tipo complesso

Le proprietà di un tipo complesso possono essere tipi scalari o tipi complessi esistenti. Tuttavia, le proprietà dei tipi complessi non possono avere riferimenti circolari. Ad esempio, un tipo complesso OnsiteCourseDetails non può avere una proprietà di tipo complesso OnsiteCourseDetails.

È possibile aggiungere una proprietà a un tipo complesso in uno dei modi elencati di seguito.

  • Fare clic con il pulsante destro del mouse su un tipo complesso nel Browser modelli, scegliere Aggiungi, quindi scegliere Proprietà scalari o Proprietà complessa, quindi selezionare il tipo di proprietà desiderato. In alternativa, è possibile selezionare un tipo complesso e quindi premere il tasto Inserisci sulla tastiera.

    Add Properties to Complex Type

    Una nuova proprietà verrà aggiunta al tipo complesso con un nome predefinito.

  • OPPURE

  • Fare clic con il pulsante destro del mouse su una proprietà di entità nell'area di Progettazione EF e scegliere Copia, quindi fare clic con il pulsante destro del mouse sul tipo complesso nel Browser modelli e scegliere Incolla.

Rinominare un tipo complesso

Quando si rinomina un tipo complesso, tutti i riferimenti al tipo presenti nell'intero progetto vengono aggiornati.

  • Fare doppio clic su un tipo complesso nel Browser modelli. Il nome verrà selezionato e sarà in modalità di modifica.

  • OPPURE

  • Fare clic con il pulsante destro del mouse su un tipo complesso nel Browser modelli e scegliere Rinomina.

  • OPPURE

  • Selezionare un tipo complesso nella finestra Browser modello e premere il tasto F2.

  • OPPURE

  • Fare clic con il pulsante destro del mouse su un tipo complesso nel Browser modelli e scegliere Proprietà. Modificare il nome nella finestra Proprietà .

Aggiungere un tipo complesso esistente a un'entità ed eseguirne il mapping delle proprietà alle colonne di tabella

  1. Fare clic con il pulsante destro del mouse su un'entità, scegliere Aggiungi nuovo e selezionare Proprietà complessa. Una proprietà del tipo complesso con un nome predefinito verrà aggiunta all'entità. Un tipo predefinito, scelto tra i tipi complessi esistenti, verrà assegnato alla proprietà.

  2. Assegnare il tipo desiderato alla proprietà nella finestra Proprietà . Dopo avere aggiunto una proprietà del tipo complesso a un'entità, è necessario eseguire il mapping delle proprietà alle colonne della tabella.

  3. Fare clic con il pulsante destro del mouse su un tipo di entità nell'area di progettazione o nel Browser modelli e selezionare Mapping tabelle. I mapping delle tabelle vengono visualizzati nella finestra Dettagli mapping.

  4. Espandere il Mappe al <nodo Nome> tabella. Viene visualizzato un nodo Mapping colonne .

  5. Espandere il nodo Mapping colonne . Verrà visualizzato un elenco di tutte le colonne della tabella. Le proprietà predefinite (se presenti) a cui viene eseguito il mapping delle colonne sono elencate sotto l'intestazione Valore/Proprietà .

  6. Selezionare la colonna da mappare e quindi fare clic con il pulsante destro del mouse sul campo Valore/Proprietà corrispondente. Verrà visualizzato un elenco a discesa di tutte le proprietà scalari.

  7. Selezionare la proprietà appropriata.

    Map Complex Type

  8. Ripetere i passaggi 6 e 7 per ogni colonna della tabella.

Nota

Per eliminare un mapping di colonne, selezionare la colonna di cui si vuole eseguire il mapping e quindi fare clic sul campo Valore/Proprietà . Selezionare quindi Elimina dall'elenco a discesa.

Eseguire il mapping di un'importazione di funzioni a un tipo complesso

Le importazioni di funzioni sono basate sulle stored procedure. Per mappare un'importazione di funzioni a un tipo complesso, le colonne restituite dalla stored procedure corrispondente devono corrispondere alle proprietà del tipo complesso nel numero e devono disporre di tipi di archiviazione che sono compatibili con i tipi di proprietà.

  • Fare doppio clic su una funzione importata di cui si vuole eseguire il mapping a un tipo complesso.

    Function Imports

  • Specificare le impostazioni per la nuova importazione di funzioni come segue:

    • Specificare la stored procedure per cui si sta creando un'importazione di funzione nel campo Nome stored procedure. Questo campo è un elenco a discesa in cui sono visualizzate tutte le stored procedure contenute nel modello di archiviazione.

    • Specificare il nome dell'importazione della funzione nel campo Nome importazione funzione.

    • Selezionare Complesso come tipo restituito e quindi specificare il tipo restituito complesso specifico scegliendo il tipo appropriato dall'elenco a discesa.

      Edit Function Import

  • Fare clic su OK. L'importazione di funzioni viene creata nel modello concettuale.

Personalizzare il mapping delle colonne per l'importazione di funzioni

  • Fare clic con il pulsante destro del mouse sull'importazione della funzione nel Browser modelli e selezionare Mapping di importazione funzioni. Viene visualizzata la finestra Dettagli mapping che mostra il mapping predefinito per l'importazione della funzione. Le frecce indicano i mapping tra i valori della proprietà e i valori della colonna. Per impostazione predefinita, i nomi della colonna corrispondono ai nomi delle proprietà di tipo complesso. I nomi delle colonne predefiniti vengono visualizzati in grigio.
  • Se necessario, modificare i nomi delle colonne per renderli corrispondenti ai nomi delle colonne restituiti dalla stored procedure che corrisponde all'importazione di funzioni.

Eliminare un tipo complesso

Quando si elimina un tipo complesso, questo viene eliminato dal modello concettuale; vengono inoltre eliminati i mapping di tutte le istanze del tipo. I riferimenti al tipo non vengono tuttavia aggiornati. Ad esempio, se un'entità dispone di una proprietà di tipo complesso di tipo ComplexType1 e ComplexType1 viene eliminata nel Browser modelli, la proprietà di entità corrispondente non viene aggiornata. Il modello non verrà convalidato perché contiene un'entità che fa riferimento a un tipo complesso eliminato. Tramite Entity Designer è possibile aggiornare o eliminare i riferimenti ai tipi complessi eliminati.

  • Fare clic con il pulsante destro del mouse su un tipo complesso nel Browser modelli e scegliere Elimina.

  • OPPURE

  • Selezionare un tipo complesso nella finestra Browser modello e premere il tasto CANC sulla tastiera.

Query per entità contenenti proprietà di tipo complesso

Il codice seguente illustra come eseguire una query che restituisce una raccolta di oggetti di tipo entità che contengono una proprietà di tipo complesso.

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