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.
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
Addedstato . -
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,
0perint,nullperstringe così via). - Se la chiave primaria è impostata su un valore, lo stato viene impostato su invariato.
- 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,
- Se la chiave primaria non viene generata dal database, l'entità viene inserita nello stesso stato della radice.
-
Se la chiave primaria dell'entità è generata dal sistema
- Questa modifica del comportamento si applica solo ai
Attachgruppi di metodi eUpdate.Addinserisce sempre le entità nelloAddedstato, anche se la chiave è impostata. -
AttachI metodi inseriscono le entità con chiavi impostate nelloUnchangedstato. Ciò facilita l'inserimento, se nuovo, altrimenti lasciarlo com'è.UpdateI metodi inseriscono le entità con chiavi definite nelloModifiedstato. 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 (oDbContext.Database.EnsureCreated()eEnsureDeleted()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.