Udostępnij za pośrednictwem


Automatyczne Migracje Code First

Automatyczne migracje umożliwiają korzystanie z Migracje Code First bez konieczności posiadania pliku kodu w projekcie dla każdej zmiany. Nie wszystkie zmiany można stosować automatycznie — na przykład zmiany nazw kolumn wymagają użycia migracji opartej na kodzie.

Uwaga

W tym artykule założono, że wiesz, jak używać Migracje Code First w podstawowych scenariuszach. Jeśli tego nie zrobisz, musisz przeczytać Migracje Code First przed kontynuowaniem.

Zalecenie dotyczące środowisk zespołowych

Możesz przeplatać automatyczne i oparte na kodzie migracje, ale nie jest to zalecane w scenariuszach tworzenia zespołu. Jeśli jesteś częścią zespołu deweloperów korzystających z kontroli źródła, należy użyć wyłącznie automatycznych migracji lub wyłącznie migracji opartych na kodzie. Biorąc pod uwagę ograniczenia migracji automatycznych, zalecamy używanie migracji opartych na kodzie w środowiskach zespołowych.

Tworzenie początkowego modelu i bazy danych

Przed rozpoczęciem korzystania z migracji potrzebujemy projektu i modelu Code First. W tym przewodniku użyjemy kanonicznego modelu Blog i Post.

  • Tworzenie nowej aplikacji konsolowej MigrationsAutomaticDemo
  • Dodawanie najnowszej wersji pakietu NuGet EntityFramework do projektu
    • Narzędzia —> Menedżer pakietów biblioteki —> konsola menedżera pakietów
    • Uruchom polecenie Install-Package EntityFramework
  • Dodaj plik Model.cs z poniższym kodem. Ten kod definiuje pojedynczą klasę Blog, która jest naszym modelem domeny, i klasę BlogContext, która jest naszym kontekstem EF Code First
    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; }
        }
    }
  • Teraz, gdy mamy model, nadszedł czas, aby użyć go do uzyskania dostępu do danych. Zaktualizuj plik Program.cs przy użyciu poniższego kodu.
    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();
            }
        }
    }
  • Uruchom aplikację i zobaczysz, że zostanie utworzona baza danych MigrationsAutomaticCodeDemo.BlogContext .

    Database LocalDB

Włączanie migracji

Nadszedł czas, aby wprowadzić więcej zmian w naszym modelu.

  • Wprowadźmy właściwość Url do klasy Blog.
    public string Url { get; set; }

Jeśli ponownie uruchomisz aplikację, otrzymasz wyjątek InvalidOperationException z informacją, że model tworzący kopię zapasową kontekstu "BlogContext" zmienił się od czasu utworzenia bazy danych. Rozważ użycie Migracje Code First do zaktualizowania bazy danych ( http://go.microsoft.com/fwlink/?LinkId=238269).

Jak sugeruje wyjątek, nadszedł czas, aby rozpocząć używanie migracji Code First. Ponieważ chcemy użyć automatycznych migracji, określimy przełącznik –EnableAutomaticMigrations .

  • Uruchom polecenie Enable-Migrations –EnableAutomaticMigrations w konsoli Menedżer pakietów To polecenie dodało folder Migrations do naszego projektu. Ten nowy folder zawiera jeden plik:

  • Klasa Configuration. Ta klasa umożliwia skonfigurowanie sposobu działania migracji dla kontekstu. W tym przewodniku po prostu użyjemy konfiguracji domyślnej. Ponieważ w projekcie istnieje tylko jeden kontekst Code First, polecenie Enable-Migrations automatycznie wypełniło typ kontekstu, do którego ta konfiguracja ma zastosowanie.

 

Pierwsza automatyczna migracja

Migracje Code First mają dwa podstawowe polecenia, z którymi się zapoznasz.

  • Add-Migration utworzy szkielet następnej migracji na podstawie zmian wprowadzonych w modelu od czasu utworzenia ostatniej migracji
  • Update-Database zastosuje wszelkie oczekujące migracje do bazy danych

Będziemy unikać używania funkcji Add-Migration (chyba że naprawdę musimy) i skupić się na automatycznym obliczaniu i stosowaniu zmian przez Migracje Code First. Użyjmy bazy danych Update-Database, aby uzyskać Migracje Code First, aby wypchnąć zmiany do naszego modelu (nowa właściwość Blog.Url) do bazy danych.

  • Uruchom polecenie Update-Database w konsoli Menedżer pakietów.

Baza danych MigrationsAutomaticDemo.BlogContext została zaktualizowana w celu uwzględnienia kolumny Url w tabeli Blogs .

 

Druga automatyczna migracja

Wprowadźmy kolejną zmianę i pozwólmy Migracje Code First automatycznie wypchnąć zmiany do bazy danych.

  • Dodajmy również nową klasę 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; }
    }
  • Dodamy również kolekcję Posts do klasy Blog, aby utworzyć drugi koniec relacji między klasami Blog a Post
    public virtual List<Post> Posts { get; set; }

Teraz użyj polecenia Update-Database , aby zapewnić aktualną bazę danych. Tym razem określimy flagę –Verbose, aby zobaczyć, jak działa kod SQL uruchamiany przez narzędzie Migracje Code First.

  • Uruchom polecenie Update-Database –Verbose w konsoli menedżera pakietów.

Dodawanie migracji opartej na kodzie

Teraz przyjrzyjmy się temu, co możemy chcieć użyć migracji opartej na kodzie.

  • Dodajmy właściwość Rating do klasy Blog
    public int Rating { get; set; }

Możemy po prostu uruchomić polecenie Update-Database , aby wypchnąć te zmiany do bazy danych. Jednak dodajemy kolumnę Blogs.Rating bez wartości null, jeśli w tabeli istnieją jakieś dane, zostanie przypisana domyślna wartość CLR typu danych dla nowej kolumny (ocena jest liczbą całkowitą, więc będzie to 0). Chcemy jednak określić wartość domyślną 3, aby istniejące wiersze w tabeli Blogs zaczynały się od przyzwoitej oceny. Użyjmy polecenia Add-Migration, aby zapisać tę zmianę w migracji opartej na kodzie, aby umożliwić jej edycję. Polecenie Add-Migration umożliwia nadanie im nazwy tych migracji. Wywołajmy metodę AddBlogRating.

  • Uruchom polecenie Add-Migration AddBlogRating w konsoli Menedżer pakietów.
  • W folderze Migracje mamy teraz nową migrację AddBlogRating . Nazwa pliku migracji jest wstępnie naprawiona za pomocą znacznika czasu, aby ułatwić zamawianie. Zmodyfikujmy wygenerowany kod, aby określić wartość domyślną 3 dla elementu Blog.Rating (wiersz 10 w poniższym kodzie)

Migracja zawiera również plik z kodem, który przechwytuje niektóre metadane. Te metadane umożliwią Migracje Code First replikowanie automatycznych migracji wykonanych przed migracją opartą na kodzie. Jest to ważne, jeśli inny deweloper chce uruchomić nasze migracje lub kiedy nadszedł czas na wdrożenie naszej aplikacji.

    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");
            }
        }
    }

Nasza edytowana migracja wygląda dobrze, więc użyjemy polecenia Update-Database, aby zaktualizować bazę danych.

  • Uruchom polecenie Update-Database w konsoli Menedżer pakietów.

Powrót do migracji automatycznych

Teraz możemy przełączyć się z powrotem do automatycznych migracji w celu uzyskania prostszych zmian. Migracje Code First zajmie się wykonywaniem automatycznych i opartych na kodzie migracji w odpowiedniej kolejności na podstawie metadanych, które są przechowywane w pliku za kodem dla każdej migracji opartej na kodzie.

  • Dodajmy właściwość Post.Abstract do naszego modelu
    public string Abstract { get; set; }

Teraz możemy użyć polecenia Update-Database, aby uzyskać Migracje Code First, aby wypchnąć tę zmianę do bazy danych przy użyciu automatycznej migracji.

  • Uruchom polecenie Update-Database w konsoli Menedżer pakietów.

Podsumowanie

W tym przewodniku pokazano, jak używać automatycznych migracji do wypychania zmian modelu do bazy danych. Pokazano również, jak utworzyć szkielet i uruchamiać migracje oparte na kodzie między automatycznymi migracjami, gdy potrzebujesz większej kontroli.