Automatické Migrace Code First
Automatické migrace umožňují používat Migrace Code First bez nutnosti mít v projektu soubor kódu pro každou změnu, kterou provedete. Ne všechny změny se dají použít automaticky – například přejmenování sloupců vyžaduje použití migrace založené na kódu.
Poznámka:
Tento článek předpokládá, že víte, jak používat Migrace Code First v základních scénářích. Pokud ne, budete si muset před pokračováním přečíst Migrace Code First.
Doporučení pro týmová prostředí
Můžete interspersovat automatické a kódové migrace, ale to se nedoporučuje ve scénářích týmového vývoje. Pokud jste součástí týmu vývojářů, kteří používají správu zdrojového kódu, měli byste použít čistě automatické migrace nebo čistě migrace založené na kódu. Vzhledem k omezením automatických migrací doporučujeme používat migrace založené na kódu v týmových prostředích.
Sestavení počátečního modelu a databáze
Než začneme používat migrace, potřebujeme projekt a model Code First, s nímž budeme pracovat. Pro účely tohoto návodu použijeme kanonický model blogu a příspěvku.
- Vytvoření nové konzolové aplikace MigrationsAutomaticDemo
- Přidání nejnovější verze balíčku NuGet EntityFramework do projektu
- Nástroje –> Správce balíčků knihovny –> Konzola Správce balíčků
- Spusťte příkaz Install-Package EntityFramework
- Přidejte soubor Model.cs s kódem zobrazeným níže. Tento kód definuje jednu třídu Blog, která tvoří náš doménový model, a třídu BlogContext, která je naším kontextem 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; }
}
}
- Teď, když máme model, je čas ho použít k přístupu k datům. Aktualizujte soubor Program.cs níže uvedeným kódem.
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();
}
}
}
Spusťte aplikaci a uvidíte, že se pro vás vytvoří databáze MigrationsAutomaticCodeDemo.BlogContext .
Povolení migrací
Je čas provést s modelem několik dalších změn.
- Pojďme ve třídě Blog použít vlastnost Url.
public string Url { get; set; }
Pokud byste aplikaci spustili znovu, získali byste výjimku InvalidOperationException, která hlásí, že model, který zálohuje kontext BlogContext, se od vytvoření databáze změnil. Zvažte použití Migrace Code First k aktualizaci databáze ( http://go.microsoft.com/fwlink/?LinkId=238269).
Jak nám výjimka napovídá, je čas začít používat migrace Code First. Protože chceme použít automatické migrace, určíme přepínač –EnableAutomaticMigrations .
Spuštění příkazu Enable-Migrations –EnableAutomaticMigrations v konzole Správce balíčků Tento příkaz přidal do našeho projektu složku Migrace. Tato nová složka obsahuje jeden soubor:
Třída Konfigurace. Tato třída umožňuje nakonfigurovat chování migrací pro váš kontext. Pro účely tohoto návodu použijeme jen výchozí konfiguraci. Vzhledem k tomu, že projekt obsahuje jen jeden kontext Code First, příkaz Enable-Migrations automaticky vyplní typ kontextu, na který se tato konfigurace vztahuje.
Vaše první automatická migrace
Migrace Code First mají dva hlavní příkazy, se kterými se seznámíte.
- Add-Migration vygeneruje další migraci na základě změn, které jste provedli v modelu od vytvoření poslední migrace
- Update-Database použije všechny čekající migrace v databázi.
Vyhneme se použití doplňku (pokud opravdu nepotřebujeme) a zaměříme se na to, aby Migrace Code First automaticky počítaly a použily změny. Pomocí update-Database získáme Migrace Code First k nasdílení změn do našeho modelu (nová vlastnost Blog.Url) do databáze.
- Spusťte příkaz Update-Database v konzole Správce balíčků.
Databáze MigrationsAutomaticDemo.BlogContext je nyní aktualizována tak, aby zahrnovala sloupec Url v tabulce Blogy .
Vaše druhá automatická migrace
Pojďme provést další změnu a nechat Migrace Code First změny automaticky odeslat do databáze.
- Pojďme také přidat novou třídu 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; }
}
- Kromě toho přidáme do třídy Blog kolekci Posts, abychom mezi Blog a Post vytvořili druhý konec vztahu.
public virtual List<Post> Posts { get; set; }
Teď pomocí update-Database můžete databázi aktualizovat. Tentokrát specifikujeme příznak–Verbose, abyste viděli skript SQL, který migrace Code First spouští.
- V konzole Správce balíčků spusťte příkaz Update-Database –Verbose.
Přidání migrace na základě kódu
Teď se podíváme na něco, pro co bychom mohli chtít použít migraci založenou na kódu.
- Pojďme do třídy Blog přidat vlastnost Hodnocení.
public int Rating { get; set; }
Mohli bychom spustit update-Database a nasdílit tyto změny do databáze. Přidáváme ale sloupec Blogs.Rating bez hodnoty null, pokud v tabulce existují nějaká data, přiřadí se výchozí hodnota CLR datového typu pro nový sloupec (Hodnocení je celé číslo, takže by to bylo 0). Chceme ale zadat výchozí hodnotu 3, aby stávající řádky v tabulce Blog začínaly obstojným hodnocením. Pomocí příkazu Add-Migration napište tuto změnu na migraci založenou na kódu, abychom ji mohli upravit. Příkaz Add-Migration nám umožňuje pojmenovat tyto migrace. Stačí volat addBlogRating.
- V konzole Správce balíčků spusťte příkaz Add-Migration AddBlogRating.
- Ve složce Migrace teď máme novou migraci AddBlogRating. Název souboru migrace je předem opravený časovým razítkem, které vám pomůže se řazením. Pojďme upravit vygenerovaný kód tak, aby určil výchozí hodnotu 3 pro Blog.Rating (řádek 10 v následujícím kódu)
Migrace obsahuje také soubor s kódem, který zachycuje určitá metadata. Tato metadata umožní Migrace Code First replikovat automatické migrace, které jsme provedli před touto migrací založenou na kódu. To je důležité, pokud jiný vývojář chce spouštět migrace nebo když je čas nasadit naši aplikaci.
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");
}
}
}
Naše upravená migrace vypadá dobře, takže pojďme pomocí příkazu Update-Database aktualizovat databázi.
- Spusťte příkaz Update-Database v konzole Správce balíčků.
Zpět na automatické migrace
Nyní můžeme přejít zpět na automatické migrace pro naše jednodušší změny. Migrace Code First se postará o provádění automatických migrací a migrací založených na kódu ve správném pořadí na základě metadat, která ukládá do souboru kódu pro každou migraci založenou na kódu.
- Pojďme do našeho modelu přidat vlastnost Post.Abstract.
public string Abstract { get; set; }
Teď můžeme použít update-Database k získání Migrace Code First k nasdílení této změny do databáze pomocí automatické migrace.
- Spusťte příkaz Update-Database v konzole Správce balíčků.
Shrnutí
V tomto názorném postupu jste zjistili, jak pomocí automatických migrací odeslat změny modelu do databáze. Viděli jste také, jak generovat a spouštět migrace založené na kódu mezi automatickými migracemi, když potřebujete větší kontrolu.