Condividi tramite


Migrazioni automatiche Code First

Le migrazioni automatiche consentono di usare Migrazioni Code First senza avere un file di codice nel progetto per ogni modifica apportata. Non tutte le modifiche possono essere applicate automaticamente. Ad esempio, le ridenominazione delle colonne richiedono l'uso di una migrazione basata su codice.

Nota

Questo articolo presuppone che tu sappia come utilizzare Code First Migrations negli scenari di base. In caso contrario, sarà necessario leggere Migrazioni Code First prima di continuare.

Raccomandazioni per gli ambienti di lavoro in team

È possibile alternare i migrazioni automatiche e basate sul codice, ma questa operazione non è consigliata negli scenari di sviluppo in team. Se si fa parte di un team di sviluppatori che usano il controllo del codice sorgente, è consigliabile usare migrazioni puramente automatiche o migrazioni puramente basate su codice. Date le limitazioni delle migrazioni automatiche, è consigliabile usare migrazioni basate su codice negli ambienti del team.

Creazione del modello iniziale e del database

Per iniziare a usare le migrazioni sono necessari un progetto e un modello Code First. In questa procedura dettagliata verranno usati i modelli tradizionali Blog e Post.

  • Creare una nuova applicazione console MigrationsAutomaticDemo
  • Aggiungere la versione più recente del pacchetto NuGet EntityFramework al progetto
    • Strumenti –> Library Package Manager (Gestione pacchetti librerie) –> Console di Gestione pacchetti
    • Eseguire il comando Install-Package EntityFramework
  • Aggiungere un file Model.cs con il codice riportato di seguito. Questo codice definisce una singola classe Blog che rappresenta il modello di dominio e una classe BlogContext che rappresenta il contesto Code First di Entity Framework
    using System.Data.Entity;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Entity.Infrastructure;

    namespace MigrationsAutomaticDemo
    {
        public class BlogContext : DbContext
        {
            public DbSet<Blog> Blogs { get; set; }
        }

        public class Blog
        {
            public int BlogId { get; set; }
            public string Name { get; set; }
        }
    }
  • È ora possibile usare il modello per eseguire l'accesso ai dati. Aggiornare il file Program.cs con il codice riportato di seguito.
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace MigrationsAutomaticDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var db = new BlogContext())
                {
                    db.Blogs.Add(new Blog { Name = "Another Blog " });
                    db.SaveChanges();

                    foreach (var blog in db.Blogs)
                    {
                        Console.WriteLine(blog.Name);
                    }
                }

                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }
    }
  • Esegui l'applicazione e vedrai che viene creato per te un database MigrationsAutomaticCodeDemo.BlogContext.

    Database Local DB

Abilitare le migrazioni

È ora possibile apportare ulteriori modifiche al modello.

  • Introdurre una proprietà Url nella classe Blog.
    public string Url { get; set; }

Se si dovesse eseguire di nuovo l'applicazione, si otterrebbe un'eccezione InvalidOperationException che indica che il modello che esegue il backup del contesto "BlogContext" è cambiato dopo la creazione del database. È consigliabile usare Migrazioni Code First per aggiornare il database (http://go.microsoft.com/fwlink/?LinkId=238269).

Come suggerisce l'eccezione, è ora di iniziare a usare Code First Migrations. Poiché si vogliono usare le migrazioni automatiche, si specificherà l'opzione –EnableAutomaticMigrations .

  • Eseguire il comando Enable-Migrations –EnableAutomaticMigrations nella Console di Gestione pacchetti. Questo comando ha aggiunto una cartella Migrations al nostro progetto. Questa nuova cartella contiene un file:

  • La classe Configuration. Questa classe consente di configurare il comportamento di Migrazioni per il contesto. In questa procedura dettagliata verrà usata solo la configurazione predefinita. Poiché è presente un solo contesto Code First nel progetto, Enable-Migrations ha specificato automaticamente il tipo di contesto a cui si applica questa configurazione.

 

La prima migrazione automatica

Le migrazioni Code First hanno due comandi principali con cui diventerai familiare.

  • Add-Migration esegue lo scaffolding della migrazione successiva in base alle modifiche apportate al modello dalla creazione dell'ultima migrazione
  • Update-Database applica tutte le migrazioni in sospeso al database

Si eviterà di usare Add-Migration (a meno che non sia veramente necessario) e ci si concentrerà sul permettere a Migrazioni Code First di calcolare e applicare automaticamente le modifiche. Usiamo Update-Database per spingere Code First Migrations a trasferire le modifiche al nostro modello (la nuova proprietà Blog.Url) nel database.

  • Eseguire il comando Update-Database nella console di Gestione pacchetti.

Il database MigrationsAutomaticDemo.BlogContext viene ora aggiornato per includere la colonna URL nella tabella Blogs .

 

La seconda migrazione automatica

Apportiamo un'altra modifica e consentiamo alle migrazioni Code First di eseguire automaticamente il push delle modifiche nel database per noi.

  • Aggiungere anche una nuova classe Post
    public class Post
    {
        public int PostId { get; set; }
        [MaxLength(200)]
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
  • Si procede anche ad aggiungere la raccolta Posts alla classe Blog per formare l'altra estremità della relazione tra Blog e Post.
    public virtual List<Post> Posts { get; set; }

Usare ora Update-Database per aggiornare il database. Specificare questa volta il flag -Verbose per poter visualizzare il codice SQL eseguito da Migrazioni Code First.

  • Eseguire il comando Update-Database –Verbose nella console di Gestione pacchetti.

Aggiunta di una migrazione basata su codice

Si esaminerà ora un aspetto per cui è possibile usare una migrazione basata su codice.

  • Aggiungere una proprietà Rating alla classe Blog
    public int Rating { get; set; }

È sufficiente eseguire Update-Database per eseguire il push di queste modifiche nel database. Tuttavia, stiamo aggiungendo una colonna Blogs.Rating non-nullable; se nella tabella sono presenti dati esistenti, verrà assegnato il valore predefinito CLR del tipo di dati per la nuova colonna (Rating è un intero, quindi sarà 0). Si supponga tuttavia di voler specificare un valore predefinito 3 in modo che le righe esistenti della tabella Blogs abbiano inizio con una classificazione ragionevole. Usare il comando Add-Migration per scrivere questa modifica in una migrazione basata su codice in modo da poterla modificare. Il comando Add-Migration consente di assegnare un nome a queste migrazioni, è sufficiente chiamare addBlogRating.

  • Eseguire il comando Add-Migration AddBlogRating in Gestione pacchetti Console.
  • Nella cartella Migrations è ora disponibile una nuova migrazione AddBlogRating. Il nome del file di migrazione è prefisso con un timestamp per facilitare l'ordinamento. Modificare il codice generato per specificare il valore predefinito 3 per Blog.Rating (riga 10 nel codice seguente)

La migrazione include anche un file code-behind che acquisisce alcuni metadati. Questi metadati consentiranno Migrazioni Code First di replicare le migrazioni automatiche eseguite prima di questa migrazione basata su codice. Questo è importante se un altro sviluppatore vuole eseguire le migrazioni o quando è il momento di distribuire l'applicazione.

    namespace MigrationsAutomaticDemo.Migrations
    {
        using System;
        using System.Data.Entity.Migrations;

        public partial class AddBlogRating : DbMigration
        {
            public override void Up()
            {
                AddColumn("Blogs", "Rating", c => c.Int(nullable: false, defaultValue: 3));
            }

            public override void Down()
            {
                DropColumn("Blogs", "Rating");
            }
        }
    }

La nostra migrazione modificata sembra buona, quindi usiamo Update-Database per aggiornare il database.

  • Eseguire il comando Update-Database nella console di Gestione pacchetti.

Torna alle migrazioni automatiche

È ora possibile tornare alle migrazioni automatiche per le modifiche più semplici. Migrazioni Code First si occuperà di eseguire le migrazioni automatiche e basate sul codice nell'ordine corretto in base ai metadati archiviati nel file code-behind per ogni migrazione basata su codice.

  • Aggiungiamo una proprietà Post.Abstract al nostro modello
    public string Abstract { get; set; }

È ora possibile usare Update-Database per fare in modo che Migrazioni Code First applichi questa modifica al database usando una migrazione automatica.

  • Eseguire il comando Update-Database nella console di Gestione pacchetti.

Riepilogo

In questa procedura dettagliata è stato illustrato come usare le migrazioni automatiche per eseguire il push delle modifiche del modello nel database. È stato anche mostrato come impostare ed eseguire migrazioni basate su codice tra le migrazioni automatiche quando si necessita di un maggiore controllo.