Condividi tramite


Cambiamenti di comportamento tra EF6 e EF Core

Si tratta di un elenco non esaustivo delle modifiche apportate al comportamento tra EF6 ed EF Core. È importante tenere presente queste considerazioni mentre porti la tua applicazione, poiché potrebbero cambiare il modo in cui l'applicazione si comporta, ma non si presenteranno come errori di compilazione dopo essere passati a EF Core.

Si tratta di una revisione generale da considerare come parte del processo di conversione. Per istruzioni più dettagliate, caso per caso, leggere i casi dettagliati.

Comportamento DbSet.Add/Attach e grafico

In EF6, la chiamata DbSet.Add() a un'entità comporta una ricerca ricorsiva per tutte le entità a cui si fa riferimento nelle relative proprietà di navigazione. Tutte le entità trovate e non sono già rilevate dal contesto vengono contrassegnate come aggiunte. DbSet.Attach() si comporta allo stesso modo, tranne che tutte le entità sono contrassegnate come invariate.

EF Core esegue una ricerca ricorsiva simile, ma con alcune regole leggermente diverse.

  • Se l'entità radice è configurata per una chiave generata e la chiave non è impostata, verrà inserita nello Added stato .
  • Per le entità trovate durante la ricerca ricorsiva delle proprietà di navigazione:
    • Se la chiave primaria dell'entità è generata dal sistema
      • Se la chiave primaria non è impostata su un valore, lo stato viene impostato su aggiunto. Il valore della chiave primaria viene considerato "non impostato" se viene assegnato il valore predefinito CLR per il tipo di proprietà (ad esempio, 0 per int, null per stringe così via).
      • Se la chiave primaria è impostata su un valore, lo stato viene impostato su invariato.
    • Se la chiave primaria non viene generata dal database, l'entità viene inserita nello stesso stato della radice.
  • Questa modifica del comportamento si applica solo ai Attach gruppi di metodi e Update . Add inserisce sempre le entità nello Added stato, anche se la chiave è impostata.
  • Attach I metodi inseriscono le entità con chiavi impostate nello Unchanged stato. Ciò facilita l'inserimento, se nuovo, altrimenti lasciarlo com'è. Update I metodi inseriscono le entità con chiavi definite nello Modified stato. Questo facilita "inseriscilo se nuovo, altrimenti aggiornalo."

La filosofia generale qui è che Update è un modo molto semplice per gestire gli inserimenti e gli aggiornamenti di entità disconnesse. Garantisce l'inserimento di nuove entità e l'aggiornamento di tutte le entità esistenti.

Allo stesso tempo, Add fornisce comunque un modo semplice per forzare l'inserimento delle entità. L'aggiunta è particolarmente utile solo quando non si usano chiavi generate dall'archivio, in modo che EF non sappia se l'entità è nuova o meno.

Per altre informazioni su questi comportamenti in EF Core, vedere Rilevamento modifiche in EF Core.

Inizializzazione del database Code First

EF6 ha una notevole quantità di magic che esegue per selezionare la connessione al database e inizializzare il database. Alcune di queste regole includono:

  • Se non viene eseguita alcuna configurazione, EF6 selezionerà un database in SQL Express o LocalDb.
  • Se una stringa di connessione con lo stesso nome del contesto si trova nel file dell'applicazione App/Web.config , verrà usata questa connessione.
  • Se il database non esiste, viene creato.
  • Se nessuna delle tabelle del modello esiste nel database, lo schema per il modello corrente viene aggiunto al database. Se le migrazioni sono abilitate, vengono usate per creare il database.
  • Se il database esiste e EF6 ha creato in precedenza lo schema, viene verificata la compatibilità con il modello corrente. Viene generata un'eccezione se il modello è stato modificato dopo la creazione dello schema.

EF Core non esegue alcuna di questa magia.

  • La connessione al database deve essere configurata in modo esplicito nel codice.
  • Non viene eseguita alcuna inizializzazione. È necessario usare DbContext.Database.Migrate() per applicare le migrazioni (o DbContext.Database.EnsureCreated() e EnsureDeleted() per creare/eliminare il database senza usare le migrazioni).

Convenzione per la denominazione delle tabelle in Code First

EF6 elabora il nome della classe di entità utilizzando un servizio di pluralizzazione per calcolare il nome predefinito della tabella a cui l'entità è mappata.

EF Core usa il nome della DbSet proprietà esposta dall'entità nel contesto derivato. Se l'entità non dispone di una DbSet proprietà, viene usato il nome della classe.

Per altre informazioni, vedere Gestione degli schemi di database.