Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 Code First migrace v základních scénářích. Pokud tomu tak není, budete si muset před pokračováním přečíst Code First Migrations.
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 Code First Migrations. 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 má dva hlavní příkazy, s nimiž se obezná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í příkazu Add-Migration (pokud to opravdu nebudeme potřebovat) a zaměříme se na to, aby Migrace Code First automaticky vypočítaly a použily změny. Použijme Update-Database k tomu, abychom pomocí Code First Migrations aplikovali změny 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 ještě jednu změnu a nechme Code First Migrace automaticky odeslat změny 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 pomocí 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, bude přiřazena výchozí hodnota CLR pro datový typ pro nový sloupec (Rating 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, pojmenujme tu naši jednoduše 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 a kódově založených migrací ve správném pořadí na základě metadat, která ukládá do souboru code-behind pro každou migraci.
- Pojďme do našeho modelu přidat vlastnost Post.Abstract.
public string Abstract { get; set; }
Teď můžeme použít Update-Database pro Migrace Code First k aplikaci 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.