Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Automatyczne migracje pozwalają na korzystanie z Migracji 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ć migracji 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 .
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 wspierający kontekst 'BlogContext' zmienił się od czasu utworzenia bazy danych. Rozważ użycie migracji 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żera pakietów. To polecenie dodało folder Migrations do naszego projektu. Ten nowy folder zawiera jeden plik:
Klasa Konfiguracji. Ta klasa umożliwia skonfigurowanie zachowania migracji dla Twojego 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ę będziemy musieli) i skupić się na automatycznym obliczaniu i stosowaniu zmian za pomocą migracji Code First. Użyjmy Update-Database, aby migracje Code First wypchnęły zmiany do naszego modelu (nową 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
Dokonajmy jeszcze jednej zmiany i pozwólmy, aby Migracje Code First automatycznie wypchnęły 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ć polecenia SQL uruchamiane przez procedurę Migracji Code First.
- Uruchom polecenie Update-Database –Verbose w konsoli menedżera pakietów.
Dodawanie migracji opartej na kodzie
Teraz przyjrzyjmy się czemuś, do czego możemy chcieć zastosować migrację opartą 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 nieprzyjmującą wartości null kolumnę Blogs.Rating, jeśli w tabeli istnieją jakiekolwiek dane, zostanie im przypisana domyślna wartość CLR typu danych dla nowej kolumny (Rating 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 nam nadanie nazwy dla tych migracji, nazwijmy naszą po prostu AddBlogRating.
- Uruchom polecenie Add-Migration AddBlogRating w konsoli Menedżera pakietów.
- W folderze Migracje mamy teraz nową migrację AddBlogRating . Nazwa pliku migracji jest poprzedzona znacznikiem czasu, aby ułatwić uporządkowanie. Zmodyfikujmy wygenerowany kod, aby określić wartość domyślną 3 dla elementu Blog.Rating (wiersz 10 w poniższym kodzie)
Również w pliku migracji znajduje się kod, 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ć Update-Database, aby Migracje Code First wypchnęły 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.