Condividi tramite


Migrations Overview

Nei progetti reali, i modelli di dati cambiano man mano che vengono implementate le funzionalità: vengono aggiunte e rimosse nuove entità e gli schemi di database devono essere modificati di conseguenza per essere sincronizzati con l'applicazione. La funzionalità delle migrazioni in EF Core consente di aggiornare in modo incrementale lo schema del database per mantenerlo sincronizzato con il modello di dati dell'applicazione mantenendo i dati esistenti nel database.

A livello generale, le migrazioni funzionano nel modo seguente:

  • Quando viene introdotta una modifica del modello di dati, lo sviluppatore usa gli strumenti di EF Core per aggiungere una migrazione corrispondente che descrive gli aggiornamenti necessari per mantenere sincronizzato lo schema del database. EF Core confronta il modello corrente con uno snapshot del modello precedente per determinare le differenze e genera i file di origine della migrazione; i file possono essere rilevati nel controllo del codice sorgente del progetto come qualsiasi altro file di origine.
  • Una volta generata una nuova migrazione, può essere applicata a un database in diversi modi. EF Core registra tutte le migrazioni applicate in una tabella di cronologia speciale, consentendogli di sapere quali migrazioni sono state applicate e quali non sono state applicate.

La parte restante di questa pagina è una guida dettagliata per principianti per l'uso delle migrazioni. Per altre informazioni dettagliate, consultare le altre pagine di questa sezione.

Getting started

Si supponga di aver appena completato la prima applicazione EF Core, che contiene il modello semplice seguente:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Durante lo sviluppo, è possibile che siano state usate le API Create and Drop per eseguire rapidamente l'iterazione del modello, modificando il modello in base alle esigenze; ma ora che l'applicazione sarà in produzione, è necessario un modo per evolvere in modo sicuro lo schema senza eliminare l'intero database.

Installa gli strumenti

Prima di tutto, è necessario installare gli strumenti da riga di comando di EF Core:

  • In genere è consigliabile usare gli strumenti dell'interfaccia della riga di comando di .NET, che funzionano su tutte le piattaforme.
  • Se si ha familiarità con l'uso all'interno di Visual Studio o si ha esperienza con le migrazioni di EF6, è anche possibile usare gli strumenti della console di Gestione pacchetti.

Creare la prima migrazione

È ora possibile aggiungere la prima migrazione. Indicare a EF Core di creare una migrazione denominata InitialCreate:

dotnet ef migrations add InitialCreate

EF Core creerà una directory denominata Migrazioni nel progetto e genererà alcuni file. È consigliabile esaminare l'esatta generazione di EF Core e eventualmente modificarla, ma per il momento verrà ignorata.

Creare il database e lo schema

A questo punto, è possibile creare il database di Entity Framework e creare lo schema dalla migrazione. Questa operazione può essere eseguita tramite le operazioni seguenti:

dotnet ef database update

Questa operazione è sufficiente: l'applicazione è pronta per l'esecuzione nel nuovo database e non è necessario scrivere una singola riga di SQL. Si noti che questo modo di applicare le migrazioni è ideale per lo sviluppo locale, ma è meno adatto per gli ambienti di produzione. Per altre informazioni, vedere la pagina Applica migrazioni .

Evoluzione del modello

Sono trascorsi alcuni giorni e viene chiesto di aggiungere un timestamp di creazione ai blog. Sono state apportate le modifiche necessarie all'applicazione e il modello avrà ora un aspetto simile al seguente:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedTimestamp { get; set; }
}

Il modello e il database di produzione non sono sincronizzati. È necessario aggiungere una nuova colonna allo schema del database. Verrà ora creata una nuova migrazione per questa operazione:

dotnet ef migrations add AddBlogCreatedTimestamp

Si noti che alle migrazioni viene assegnato un nome descrittivo per semplificare la comprensione della cronologia del progetto in un secondo momento.

Poiché non si tratta della prima migrazione del progetto, EF Core confronta ora il modello aggiornato con uno snapshot del modello precedente, prima dell'aggiunta della colonna; Lo snapshot del modello è uno dei file generati da EF Core quando si aggiunge una migrazione e viene archiviato nel controllo del codice sorgente. In base a tale confronto, EF Core rileva che è stata aggiunta una colonna e aggiunge la migrazione appropriata.

È ora possibile applicare la migrazione come prima:

dotnet ef database update

Si noti che questa volta Ef rileva che il database esiste già. Inoltre, quando la prima migrazione è stata applicata in precedenza, questo fatto è stato registrato in una speciale tabella della cronologia delle migrazioni nel database; in questo modo Ef può applicare automaticamente solo la nuova migrazione.

Esclusione di parti del modello

In alcuni casi è possibile fare riferimento a tipi da un altro DbContext. Ciò può causare conflitti di migrazione. Per evitare questo problema, escludere il tipo dalle migrazioni di uno dei DbContexts.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUser>()
        .ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}

Next steps

La precedente è stata solo una breve introduzione alle migrazioni. Per altre informazioni sulla gestione delle migrazioni, sull'applicazione e su altri aspetti, vedere le altre pagine della documentazione. Il riferimento allo strumento dell'interfaccia della riga di comando di .NET contiene anche informazioni utili sui diversi comandi

Additional resources