Migrazioni Code First automatica

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 si sappia come usare Migrazioni Code First in scenari di base. In caso contrario, sarà necessario leggere Migrazioni Code First prima di continuare.

Raccomandazione per gli ambienti del team

È possibile intersperse le 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();
            }
        }
    }
  • Eseguire l'applicazione e si noterà che viene creato automaticamente un database MigrationsAutomaticCodeDemo.BlogContext .

    Database LocalDB

Abilitare le migrazioni

È ora possibile apportare ulteriori modifiche al modello.

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

Se si esegue di nuovo l'applicazione, viene generata un'eccezione InvalidOperationException con il messaggio Il modello corrispondente al contesto "BlogContext" è stato modificato dopo la creazione del database. Provare a utilizzare Migrazioni Code First per aggiornare il database (http://go.microsoft.com/fwlink/?LinkId=238269).

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

  • Eseguire il comando Enable-Migrations –EnableAutomaticMigrations in Gestione pacchetti Console Questo comando ha aggiunto una cartella Migrations al 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

Migrazioni Code First include due comandi principali.

  • 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 concentrarsi su come consentire Migrazioni Code First calcolare e applicare automaticamente le modifiche. Si userà Update-Database per ottenere Migrazioni Code First per eseguire il push delle modifiche al 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

Apportare un'altra modifica e consentire Migrazioni Code First eseguire automaticamente il push delle modifiche nel database.

  • 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 all'aggiunta delle raccolta Posts alla classe Blog per creare l'altro elemento 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, si aggiunge 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 è integer, in modo che sia 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 file di migrazione è pre-corretto 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 migrazione modificata è ora pronta. Usare 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.

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

È ora possibile usare Update-Database per ottenere Migrazioni Code First per eseguire il push di questa modifica nel 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 illustrato come eseguire lo scaffolding ed eseguire migrazioni basate su codice tra le migrazioni automatiche quando è necessario un maggiore controllo.