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 posizione DbContext in cui TEntity 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 a Post e sono Blog 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.