Modifiche del comportamento tra EF6 ed EF Core

Si tratta di un elenco non esaustivo delle modifiche apportate al comportamento tra EF6 ed EF Core. È importante tenere presenti queste considerazioni quando si trasferisce l'applicazione, in quanto possono cambiare il comportamento dell'applicazione, ma non vengono visualizzate come errori di compilazione dopo il passaggio 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 di DbSet.Add/Attach e del grafico

Quando in EF6 si chiama DbSet.Add() su un'entità viene eseguita una ricerca ricorsiva di tutte le entità a cui si fa riferimento nelle proprietà di navigazione. Anche tutte le entità trovate e non ancora rilevate dal contesto vengono contrassegnate come aggiunte. DbSet.Attach() si comporta allo stesso modo, ad eccezione del fatto che tutte le entità sono contrassegnate come non modificate.

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à rilevate durante la ricerca ricorsiva delle proprietà di navigazione:
    • Se la chiave primaria dell'entità è generata dall'archivio
      • Se la chiave primaria non è impostata su un valore, lo stato viene impostato su aggiunto. Il valore della chiave primaria viene considerato come "non impostato" se riceve il valore CLR predefinito per il tipo di proprietà, ad esempio 0 per int, null per string e così via.
      • Se la chiave primaria è impostata su un valore, lo stato è impostato su non modificato.
    • Se la chiave primaria non è generata dal database, l'entità viene impostata con lo 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 inserisce le entità con chiavi impostate nello Unchanged stato . Ciò facilita l'inserimento se nuovo, altrimenti lascialo da solo. Update I metodi inserisce le entità con chiavi impostate nello Modified stato . In questo modo viene facilitato l'inserimento se nuovo, in caso contrario viene aggiornato.

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 si basa su varie regole magic che esegue per selezionare la connessione al database e inizializzare il database. Alcune di queste regole sono:

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

EF Core non esegue nessuna di queste regole magic.

  • 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 di denominazione della tabella Code First

EF6 elabora il nome della classe di entità in un servizio di pluralizzazione per calcolare il nome predefinito della tabella alla quale è stata mappata l'entità.

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

Per altre informazioni, vedere Gestione degli schemi di database.