Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Entity Framework Core, o EF Core per brevità, è una riscrittura totale di Entity Framework per architetture di applicazioni moderne. A causa di modifiche fondamentali, non esiste un percorso di aggiornamento diretto. Lo scopo di questa documentazione è fornire una guida end-to-end per la conversione delle applicazioni EF6 in EF Core.
Importante
Prima di avviare il processo di conversione, è importante verificare che EF Core soddisfi i requisiti di accesso ai dati per l'applicazione. È possibile trovare tutti gli elementi necessari nella documentazione di EF Core.
Avvertimento
EF Core supporta solo .NET moderno e non supporta .NET Framework. Di conseguenza, se il progetto è ancora destinato a .NET Framework, è necessario eseguire la migrazione a .NET moderno prima di iniziare la migrazione da EF6 a EF Core. Si noti che EF6 supporta .NET moderno, quindi è possibile eseguire prima la migrazione a .NET moderno mantenendo EF6 e quindi affrontare la migrazione da EF6 a EF Core.
Motivi per eseguire l'aggiornamento
Tutto il nuovo sviluppo di Entity Framework avviene in EF Core. Non sono previsti piani per eseguire il backport delle nuove funzionalità in EF6. EF Core viene eseguito nei runtime .NET più recenti e sfrutta appieno il runtime, specifico della piattaforma (ad esempio ASP.NET Core o WPF) e le funzionalità specifiche del linguaggio. Ecco alcuni dei vantaggi offerti dall'aggiornamento:
- Sfruttare i miglioramenti delle prestazioni in corso in EF Core. Ad esempio, un cliente che ha eseguito la migrazione da EF6 a EF Core 6 ha visto una riduzione di 40 volte nell'uso di una query pesante a causa della funzionalità di suddivisione delle query. Molti clienti segnalano enormi miglioramenti delle prestazioni semplicemente passando alla versione più recente di EF Core.
- Usare nuove funzionalità in EF Core. Non saranno state aggiunte nuove funzionalità a EF6. Tutte le nuove funzionalità, ad esempio il provider Azure Cosmos DB e
DbContextFactory, verranno aggiunte solo a EF Core. Per un confronto completo di EF6 con EF Core, incluse diverse funzionalità esclusive di EF Core, vedere Confronto tra EF Core ed EF6. - Modernizza lo stack delle applicazioni utilizzando l'iniezione di dipendenze e integra senza intoppi l'accesso ai dati con tecnologie come gRPC e GraphQL.
Nota sulle migrazioni
Questa documentazione usa le condizioni porta e aggiornamento per evitare confusione con il termine migrazioni come funzionalità di EF Core. Le migrazioni in EF Core non sono compatibili con le migrazioni Code First di EF6 a causa di miglioramenti significativi della gestione delle migrazioni. Non esiste un approccio consigliato per convertire la cronologia delle migrazioni, quindi pianifica di ricominciare da zero in EF Core. È possibile gestire la codebase e i dati dalle migrazioni di EF6. Applicare la migrazione finale in EF6, quindi creare una migrazione iniziale in EF Core. Sarà possibile tenere traccia della cronologia in EF Core in futuro.
Passaggi dell'aggiornamento
Il percorso di aggiornamento è stato suddiviso in diversi documenti organizzati in base alla fase dell'aggiornamento e al tipo di applicazione.
Determinare il "flavor" di EF Core
Esistono diversi approcci per il funzionamento di EF Core con il modello di dominio e l'implementazione del database. In generale, la maggior parte delle app seguirà uno di questi modelli e il modo in cui si avvicina la porta dipenderà dal "flavor" dell'applicazione.
Il codice come origine della verità è un approccio in cui tutto viene modellato tramite codice e classi, sia tramite attributi di dati, configurazione fluente o una combinazione di entrambi. Il database viene inizialmente generato in base al modello definito in EF Core e gli aggiornamenti aggiuntivi vengono in genere gestiti tramite migrazioni. Questo approccio viene spesso definito "code first", ma il nome non è completamente accurato perché un approccio consiste nell'iniziare con un database esistente, generare le entità e quindi mantenere con il codice in futuro.
L'approccio database come origine della verità comporta il reverse engineering o lo scaffolding del codice dal database. Quando vengono apportate modifiche allo schema, il codice viene rigenerato o aggiornato per riflettere le modifiche. Questa operazione viene spesso chiamata "database first".
Infine, un approccio di mapping ibrido più avanzato segue la filosofia secondo cui il codice e il database vengono gestiti separatamente e EF Core viene usato per eseguire il mapping tra i due. Questo approccio in genere elimina le migrazioni.
La tabella seguente riepiloga alcune differenze generali:
| Approccio | Ruolo sviluppatore | Ruolo DBA | migrations | Impalcatura | Repository |
|---|---|---|---|---|---|
| Code first | Progettare entità e verificare/personalizzare le migrazioni generate | Verificare le definizioni e le modifiche dello schema | Per ogni commit | Non disponibile | Tenere traccia di entità, DbContext e migrazioni |
| Prima il database | Ricostruire il progetto dopo le modifiche e verificare le entità generate | Informare gli sviluppatori quando il database cambia per eseguire nuovamente lo scaffolding | Non disponibile | Per modifica dello schema | Tenere traccia delle estensioni/classi parziali che estendono le entità generate |
| Ibrido | Aggiornare la configurazione Fluent per eseguire il mapping ogni volta che le entità o il database cambiano | Informare gli sviluppatori quando il database è stato modificato in modo da poter aggiornare le entità e la configurazione del modello | Non disponibile | Non disponibile | Monitorare le entità e il DbContext |
L'approccio ibrido è un approccio più avanzato con un sovraccarico aggiuntivo rispetto agli approcci tradizionali al codice e al database.
Comprendere l'impatto dello spostamento da EDMX
EF6 supporta un formato speciale di definizione del modello denominato ENTITY Data Model XML (EDMX). I file EDMX contengono più definizioni, incluse le definizioni dello schema concettuale (CSDL), le specifiche di mapping (MSL) e le definizioni dello schema di archiviazione (SSDL). EF Core tiene traccia dei domini, del mapping e degli schemi di database tramite grafici dei modelli interni e non supporta il formato EDMX. Molti post di blog e articoli indicano erroneamente questo significa che EF Core supporta solo "code first". EF Core supporta tutti e tre i modelli di applicazione descritti nella sezione precedente. È possibile ricompilare il modello in EF Core decompilando il database. Se si usa EDMX per una rappresentazione visiva del modello di entità, prendere in considerazione l'uso di EF Core Power Tools open source che forniscono funzionalità simili per EF Core.
Per ulteriori informazioni sull'impatto della mancanza di supporto per i file EDMX, leggi la guida al porting EDMX.
Eseguire i passaggi di aggiornamento
Non è un requisito per convertire l'intera applicazione. EF6 ed EF Core possono essere eseguiti nella stessa applicazione (vedere: uso di EF Core e EF6 nella stessa applicazione). Per ridurre al minimo i rischi, è possibile prendere in considerazione:
- Passa a EF6 su .NET Core se non l'hai già fatto.
- Migrare una piccola parte dell'app verso EF Core ed eseguirla fianco a fianco con EF6.
- Infine, portare il resto della codebase in EF Core e ritirare il codice EF6.
Per quanto riguarda la porta stessa, ad alto livello, è possibile:
- Esaminare le modifiche del comportamento tra EF6 e EF Core.
- Eseguire le migrazioni finali, se presenti, in EF6.
- Creare il progetto EF Core.
- Copiare il codice nel nuovo progetto, eseguire reverse engineering o una combinazione di entrambi.
- Rinominare riferimenti ed entità e aggiornare i comportamenti:
-
System.Data.EntityaMicrosoft.EntityFrameworkCore - Modificare
DbContextil costruttore per utilizzare le opzioni e/o eseguire l'overrideOnConfiguring -
DbModelBuilderaModelBuilder - Rinominare
DbEntityEntry<T>inEntityEntry<T> - Passare da
Database.LogaMicrosoft.Extensions.Logging(api avanzate) oDbContextOptionsBuilder.LogTo(semplici) - Applicare le modifiche per
WithRequiredeWithOptional(vedere qui) - Aggiornare il codice di convalida. Non esiste alcuna convalida dei dati incorporata in EF Core, ma è possibile eseguirla manualmente.
- Seguire i passaggi necessari per convertire da EDMX.
-
- Eseguire passaggi specifici in base all'approccio di EF Core:
Esistono molte considerazioni relative a tutti gli approcci, quindi è anche possibile esaminare i modi per affrontare e risolvere le differenze dettagliate tra EF6 e EF Core.