Panoramica di Entity Framework
Entity Framework è un set di tecnologie in ADO.NET che supportano lo sviluppo di applicazioni software orientate ai dati. Gli architetti e gli sviluppatori di questo tipo di applicazioni si trovano nella difficile condizione di dover realizzare due obiettivi molto diversi tra loro, ovvero la modellazione delle entità, delle relazioni e della logica dei problemi aziendali che sono preposti a risolvere e al tempo stesso la gestione dei motori dei dati usati per archiviare e recuperare i dati stessi. Dal momento che i dati potrebbero essere distribuiti in più sistemi di archiviazione, ciascuno con i suoi protocolli, è necessario che nelle applicazioni che gestiscono un solo sistema di archiviazione venga rispettato l'equilibrio tra i requisiti del sistema di archiviazione e i requisiti di scrittura di codice dell'applicazione efficiente e gestibile.
Entity Framework consente agli sviluppatori di utilizzare i dati sotto forma di proprietà e oggetti specifici di un dominio, ad esempio clienti e indirizzi dei clienti, indipendentemente dalle tabelle e dalle colonne del database sottostanti in cui sono archiviati. Con Entity Framework gli sviluppatori possono operare a un livello superiore di astrazione quando gestiscono i dati e possono creare e gestire applicazioni orientate ai dati con meno codice rispetto alle applicazioni tradizionali. Poiché Entity Framework è un componente di .NET Framework, le applicazioni Entity Framework possono essere eseguite in qualsiasi computer in cui è installato .NET Framework a partire dalla versione 3.5 SP1.
Realizzare i modelli
Un approccio di progettazione comune e consolidato quando si compila un'applicazione o un servizio consiste nel dividere l'applicazione o il servizio in tre parti: un modello di dominio, un modello logico e un modello fisico. Il modello di dominio definisce le entità e le relazioni nel sistema da modellare. Il modello logico per un database relazionale normalizza le entità e le relazioni in tabelle con vincoli di chiave esterna. Il modello fisico gestisce le funzionalità di un determinato motore dei dati specificando dettagli sull'archiviazione come il partizionamento e l'indicizzazione.
Il modello fisico viene ridefinito dagli amministratori del database per migliorare le prestazioni, ma i programmatori che scrivono il codice delle applicazioni tendono a usare solo il modello logico scrivendo query SQL e chiamando stored procedure. I modelli di dominio vengono in genere usati come strumento per l'acquisizione e la comunicazione dei requisiti di un'applicazione, spesso come diagrammi inerti visualizzati e discussi nelle fasi iniziali di un progetto e quindi abbandonati. Molti team di sviluppo saltano la fase di creazione di un modello concettuale e partono direttamente dall'indicazione di tabelle, colonne e chiavi in un database relazionale.
Entity Framework favorisce la realizzazione dei modelli perché consente agli sviluppatori di eseguire query su entità e relazioni del modello di dominio (denominato modello concettuale in Entity Framework) basandosi su Entity Framework per convertire le operazioni in comandi specifici dell'origine dati. Le applicazioni non sono quindi più vincolate a dipendenze hard-coded su una determinata origine dati.
Quando si usa Code First, viene eseguito il mapping del modello concettuale al modello di archiviazione nel codice. Entity Framework può dedurre il modello concettuale in base ai tipi di oggetto e alle configurazioni aggiuntive definite. I metadati di mapping vengono generati in fase di esecuzione in base a una combinazione della modalità di definizione dei tipi di dominio e delle informazioni di configurazione aggiuntive fornite nel codice. Entity Framework genera il database necessario in base ai metadati. Per altre informazioni, vedere Creazione di un modello.
Quando si usano gli strumenti di Entity Data Model, il modello concettuale, il modello di archiviazione e i mapping tra i due vengono espressi in schemi basati su XML e definiti in file con estensioni corrispondenti:
Il linguaggio CSDL (Conceptual Schema Definition Language) definisce il modello concettuale. CSDL è l'implementazione di Entity Framework dell'Entity Data Model. L'estensione del file è csdl.
Il linguaggio SSDL (Store Schema Definition Language) definisce il modello di archiviazione, chiamato anche modello logico. L'estensione del file è ssdl.
Il linguaggio MSL (Mapping Specification Language) definisce i mapping tra il modello di archiviazione e il modello concettuale. L'estensione del file è msl.
Il modello di archiviazione e i mapping possono essere modificati in base alle esigenze senza che sia necessario modificare il modello concettuale, le classi di dati o il codice dell'applicazione. Poiché i modelli di archiviazione sono specifici del provider, è possibile usare un modello concettuale coerente in varie origini dati.
Entity Framework usa questi file del modello e di mapping per trasformare operazioni di creazione, lettura, aggiornamento ed eliminazione di entità e relazioni del modello concettuale in operazioni equivalenti nell'origine dati. Entity Framework supporta anche il mapping delle entità del modello concettuale a stored procedure dell'origine dati. Per altre informazioni, vedere Specifiche CSDL, SSDL e MSL.
Eseguire il mapping di oggetti ai dati
La programmazione orientata a oggetti pone una serie di sfide relativamente all'interazione con i sistemi di archiviazione dei dati. Anche se l'organizzazione delle classi in genere rispecchia l'organizzazione delle tabelle dei database relazionali, non si può parlare di una corrispondenza esatta. Più tabelle normalizzate corrispondono spesso a una singola classe e le relazioni tra classi sono spesso rappresentate in modo diverso rispetto alle relazioni tra tabelle. Per rappresentare il cliente per un determinato ordine, ad esempio, una classe Order
potrebbe usare una proprietà contenente un riferimento a un'istanza di una classe Customer
, mentre una riga della tabella Order
in un database contiene una colonna o un set di colonne di chiave esterna con un valore che corrisponde a un valore di chiave primaria nella tabella Customer
. Una classe Customer
potrebbe disporre di una proprietà denominata Orders
contenente una raccolta di istanze della classe Order
, mentre la tabella Customer
in un database non include colonne confrontabili. Entity Framework offre agli sviluppatori la flessibilità di rappresentare relazioni in questo modo o di modellare con maggiore precisione le relazioni come vengono rappresentate nel database.
Le soluzioni esistenti hanno tentato di colmare questo divario, spesso definito "mancata corrispondenza dell'impedenza" eseguendo solo il mapping di classi e proprietà orientate a oggetti a tabelle e colonne relazionali. Anziché adottare questo approccio tradizionale, Entity Framework esegue il mapping di tabelle relazionali, colonne e vincoli di chiave esterna dei modelli logici a entità e relazioni dei modelli concettuali. Il risultato ottenuto è una maggiore flessibilità nella definizione degli oggetti e nell'ottimizzazione del modello logico. Gli strumenti di Entity Data Model generano classi di dati estendibili basate sul modello concettuale. Queste classi sono classi parziali che è possibile estendere con membri altri aggiunti dallo sviluppatore. Per impostazione predefinita, le classi generate per un particolare modello concettuale derivano da classi di base che forniscono servizi per la materializzazione di entità come oggetti e per il rilevamento e il salvataggio delle modifiche. Queste classi possono essere usate dagli sviluppatori per gestire le entità e le relazioni come oggetti correlati da associazioni. Gli sviluppatori possono inoltre personalizzare le classi generate per un modello concettuale. Per altre informazioni, vedere Uso di oggetti.
Accedere ai dati delle entità e modificarli
Oltre a rappresentare una soluzione di mapping relazionale a oggetti, Entity Framework è uno strumento che consente alle applicazioni di accedere e modificare i dati rappresentati come entità e relazioni nel modello concettuale. Entity Framework utilizza le informazioni nei file del modello e di mapping per convertire le query di oggetto eseguite su tipi di entità rappresentati nel modello concettuale in query specifiche dell'origine dati. I risultati delle query vengono materializzati in oggetti gestiti da Entity Framework. Entity Framework offre le seguenti modalità per eseguire query in un modello concettuale e restituire oggetti:
LINQ to Entities Fornisce il supporto LINQ (Language Integrated Query) per l'esecuzione di query nei tipi di entità definiti in un modello concettuale. Per altre informazioni, vedere LINQ to Entities.
Entity SQL Dialetto SQL indipendente dall'archiviazione che interagisce direttamente con le entità del modello concettuale e supporta i concetti di Entity Data Model. Entity SQL viene usato sia con le query di oggetto sia con le query eseguite tramite il provider EntityClient. Per altre informazioni, vedere Panoramica di Entity SQL.
Entity Framework include il provider di dati EntityClient. Questo provider gestisce connessioni, converte query di entità in query specifiche dell'origine dati e restituisce un lettore dati usato da Entity Framework per materializzare i dati dell'entità in oggetti. Quando la materializzazione degli oggetti non è necessaria, il provider EntityClient può essere utilizzato anche come un provider di dati ADO.NET standard consentendo alle applicazioni di eseguire query Entity SQL e di utilizzare il lettore dati di sola lettura restituito. Per ulteriori informazioni, vedere Provider EntityClient per Entity Framework.
Nel diagramma seguente viene illustrata l'architettura di Entity Framework per l'accesso ai dati:
Tramite gli strumenti di Entity Data Model è possibile generare una classe derivata da System.Data.Objects.ObjectContext
o System.Data.Entity.DbContext
che rappresenta il contenitore di entità nel modello concettuale. Questo contesto dell'oggetto fornisce le funzionalità di registrazione delle modifiche e di gestione di identità, concorrenza e relazioni. Questa classe espone inoltre un metodo SaveChanges
che scrive inserimenti, aggiornamenti ed eliminazioni nell'origine dati. Analogamente alle query, queste modifiche vengono eseguite da comandi generati automaticamente dal sistema o da stored procedure specificate dallo sviluppatore.
Provider di dati
Il provider EntityClient
estende il modello del provider ADO.NET tramite l'accesso ai dati in termini di relazioni ed entità concettuali. Esegue query che usano Entity SQL. Entity SQL fornisce il linguaggio di query sottostante che consente a EntityClient
di comunicare con il database. Per ulteriori informazioni, vedere Provider EntityClient per Entity Framework.
Entity Framework include un provider di dati SqlClient aggiornato che supporta gli alberi dei comandi canonici. Per altre informazioni, vedere SqlClient per Entity Framework.
Strumenti di Entity Data Model
Insieme al runtime di Entity Framework, Visual Studio include gli strumenti di mapping e modellazione. Per altre informazioni, vedere Modellazione e mapping.
Altre informazioni
Per altre informazioni su Entity Framework, vedere:
Introduzione: fornisce informazioni su come diventare subito operativi tramite la Guida rapida, che illustra come creare un'applicazione Entity Framework semplice.
Terminologia di Entity Framework: definisce molti dei termini introdotti da Entity Data Model ed Entity Framework, che vengono utilizzati nella documentazione di Entity Framework.
Risorse di Entity Framework: include collegamenti ad argomenti concettuali e collegamenti a risorse e argomenti esterni per la compilazione di applicazioni Entity Framework.