Casi dettagliati per la conversione da EF6 a EF Core
Questo documento illustra in dettaglio alcune differenze specifiche tra EF6 e EF Core. Consultare questa guida durante la conversione del codice.
Configurazione della connessione al database
Esistono diverse differenze tra il modo in cui EF6 si connette a varie origini dati rispetto a EF Core. Sono importanti per comprendere quando si esegue la conversione del codice.
- stringhe di Connessione ion: EF Core non supporta direttamente più overload del costruttore per diversi stringa di connessione, come fa EF6. Si basa invece su DbContextOptions. È comunque possibile fornire più overload del costruttore nei tipi derivati, ma sarà necessario eseguire il mapping delle connessioni tramite le opzioni.
- Configurazione e cache: EF Core supporta un'implementazione più affidabile e flessibile dell'inserimento delle dipendenze con un'infrastruttura interna in grado di connettersi ai provider di servizi esterni. Può essere gestito dall'applicazione per gestire le situazioni in cui è necessario scaricare le cache. La versione ef6 era limitata e non poteva essere scaricata.
- File di configurazione: EF6 supporta la configurazione tramite file di configurazione che possono includere il provider. EF Core richiede un riferimento diretto all'assembly del provider e alla registrazione esplicita del provider (ad esempio
UseSqlServer
). - Connessione factory di connessione: EF6 supporta le factory di connessione. EF Core non supporta le factory di connessione e richiede sempre un stringa di connessione.
- Registrazione: in generale, la registrazione in EF Core è molto più affidabile e offre più opzioni per la configurazione ottimizzata.
Convenzioni
EF6 supporta le convenzioni personalizzate ("lightweight") e le convenzioni dei modelli. Le convenzioni leggere sono simili alla configurazione del modello precon convention di EF Core. Altre convenzioni sono supportate come parte della compilazione di modelli.
EF6 esegue convenzioni dopo la compilazione del modello. EF Core li applica durante la compilazione del modello. In EF Core è possibile separare la compilazione di modelli dalle sessioni attive con un oggetto DbContext. È possibile creare un modello inizializzato con le convenzioni.
Convalida dei dati
EF Core non supporta la convalida dei dati e usa solo annotazioni di dati per la compilazione del modello e delle migrazioni. La maggior parte delle librerie client da Web/MVC a WinForms e WPF fornisce un'implementazione di convalida dei dati da usare.
Funzionalità presto disponibili
In EF6 sono presenti alcune funzionalità che non esistono ancora in EF Core, ma sono nella roadmap del prodotto.
- Il tipo TPC (Table-Per-Concrete Type) è stato supportato in EF6 insieme alla "suddivisione delle entità". TPC è in programma per EF7.
- Il mapping delle stored procedure in EF6 consente di delegare operazioni di creazione, aggiornamento ed eliminazione alle stored procedure. EF Core attualmente consente solo il mapping alle stored procedure per le letture. Il supporto per la creazione, l'aggiornamento e l'eliminazione (CUD) è la roadmap per EF7.
- I tipi complessi in EF6 sono simili ai tipi di proprietà in EF Core. Tuttavia, il set completo di funzionalità verrà risolto con oggetti valore in EF7.
Lasciare ObjectContext dietro
EF Core usa un oggetto DbContext anziché un oggetto ObjectContext
. Sarà necessario aggiornare il codice che usa IObjectContextAdapter. Questa operazione è stata talvolta usata per le query con PreserveChanges
o OverwriteChanges
l'opzione di unione. Per funzionalità simili in EF Core, esaminare il metodo Reload .
Configurazione del modello
Esistono molte differenze importanti tra il modo in cui sono progettati i modelli in EF6 e EF Core. EF Core non supporta completamente il mapping condizionale. Non dispone di versioni del generatore di modelli.
Altre differenze includono:
Individuazione del tipo
In EF Core i tipi di entità vengono individuati dal motore in tre modi:
- Esporre un oggetto
DbSet<TEntity>
nella posizioneDbContext
in cuiTEntity
si desidera tenere traccia del tipo. - Fare riferimento a da
Set<TEntity>
un punto qualsiasi del codice. - I tipi complessi a cui si fa riferimento dai tipi individuati vengono individuati in modo ricorsivo(ad esempio, se i
Blog
riferimenti aPost
e sonoBlog
individuabili,Post
verranno individuati anche)
Gli assembly non vengono analizzati per i tipi derivati.
scambio
L'estensione .Map()
in EF6 è stata sostituita con overload e metodi di estensione in EF Core. Ad esempio, è possibile usare '. HasDiscriminator()' per configurare la tabella per gerarchia (TPH). Vedere: Modellazione dell'ereditarietà.
Mapping dell'ereditarietà
EF6 supportato da tabella per gerarchia (TPH), table-per-type (TPT) e table-per-concrete-class (TPC) e abilitato il mapping ibrido di versioni diverse a livelli diversi della gerarchia. EF Core continuerà a richiedere una catena di ereditarietà per modellare unidirezionale (TPT o TPH) e il piano consiste nell'aggiungere il supporto per TPC in EF7.
Vedere: Modellazione dell'ereditarietà.
Attributi
EF6 supporta gli attributi di indice per le proprietà. In EF Core vengono applicate a livello di tipo che dovrebbe semplificare gli scenari che richiedono indici compositi. EF Core non supporta chiavi composite con annotazioni di dati (ad esempio, l'uso di Order in ColumnAttribute
insieme a KeyAttribute
).
Per altre informazioni, vedere Indici e vincoli.
Obbligatorio e facoltativo
Nella compilazione IsRequired
di modelli di EF Core configura solo gli elementi necessari alla fine dell'entità. HasForeignKey
ora configura l'entità finale. Per convertire il codice, sarà invece più semplice usare .Navigation().IsRequired()
. Ad esempio:
EF6:
modelBuilder.Entity<Instructor>()
.HasRequired(t => t.OfficeAssignment)
.WithRequiredPrincipal(t => t.Instructor);
EF Core 6:
modelBuilder.Entity<Instructor>()
.HasOne(t => t.OfficeAssignment)
.WithOne(t => t.Instructor)
.HasForeignKey<OfficeAssignment>();
modelBuilder.Entity<Instructor>()
.Navigation(t => t.OfficeAssignment)
.IsRequired();
modelBuilder.Entity<OfficeAssignment>()
.Navigation(t => t.Instructor)
.IsRequired();
Per impostazione predefinita, tutto è facoltativo, quindi in genere non è necessario chiamare .IsRequired(false)
.
Supporto spaziale
EF Core si integra con la libreria della community di librerie di terze parti NetTopologySuite per fornire supporto spaziale.
Associazioni indipendenti
EF Core non supporta associazioni indipendenti (un concetto EDM che consente di definire la relazione tra due entità indipendentemente dalle entità stesse). Un concetto simile supportato in EF Core è rappresentato dalle proprietà shadow.
Migrazioni
EF Core non supporta gli inizializzatori di database o le migrazioni automatiche. Anche se non migrate.exe
è presente in EF Core, è possibile produrre bundle di migrazione.
Strumenti di Visual Studio
EF Core non dispone di alcuna finestra di progettazione, nessuna funzionalità per aggiornare il modello dal database e nessun flusso model-first. Non esiste alcuna procedura guidata di reverse engineering e nessun modello predefinito.
Anche se queste funzionalità non vengono fornite con EF Core, esistono progetti della community OSS che forniscono strumenti aggiuntivi. In particolare, EF Core Power Tools offre:
- Reverse engineering dall'interno di Visual Studio con supporto per i progetti di database (
.dacpac
). Include personalizzazioni del codice basate su modello. - Ispezione visiva di DbContext con grafo del modello e creazione di script.
- Gestione delle migrazioni da Visual Studio usando un'interfaccia utente grafica.
Per un elenco completo degli strumenti e delle estensioni della community, vedere: EF Core Tools and Extensions (Strumenti ed estensioni di EF Core).
Rilevamento modifiche
Esistono diverse differenze tra il modo in cui EF6 e EF Core gestiscono il rilevamento delle modifiche. Questi sono riepilogati nella tabella seguente:
Funzionalità | EF6 | EF Core |
---|---|---|
Stato dell'entità | Aggiunge/allega l'intero grafico | Supporta gli spostamenti per le entità scollegate |
Orfani | Mantenuta | Eliminati |
Entità disconnesse e con rilevamento automatico | Supportato | Non supportato |
Mutazioni | Eseguita sulle proprietà | Eseguito sui campi di backup* |
Data binding | .Local |
.Local più .ToObservableCollection o .ToBindingList |
Rilevamento delle modifiche | Grafico completo | Per entità |
* Per impostazione predefinita, la notifica delle proprietà non verrà attivata in EF Core, quindi è importante configurare le entità di notifica.
Si noti che EF Core non chiama automaticamente il rilevamento delle modifiche come EF6.
EF Core introduce un dettaglio DebugView
per lo strumento di rilevamento delle modifiche. Per altre informazioni, vedere Debug di Rilevamento modifiche.
Query
EF6 include alcune funzionalità di query che non esistono in EF Core. tra cui:
- Alcuni mapping comuni di funzioni C# e funzioni SQL.
- Intercettazione dell'albero dei comandi per query e aggiornamenti.
- Supporto per i parametri con valori di tabella (TVP).
EF6 include il supporto predefinito per i proxy di caricamento differita. Si tratta di un pacchetto di consenso esplicito per EF Core (vedere Caricamento differita di dati correlati).
EF Core consente di comporre su SQL non elaborato usando FromSQL
.