Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Нередко возникает ситуация, когда модель меняется. Например, мы решили внести в нее новые свойства. Но при этом у нас уже имеется существующая база данных, в которой есть какие-то данные. И чтобы без потерь обновить базу данных ASP.NET MVC предлагает нам такой механизм как миграции. Например, у нас есть простая модель User:
public class User { public int Id { get; set; } public string Name { get; set; } }
Соответсвенно есть контекст данных, через который мы работаем с бд:
public class UserContext : DbContext { public UserContext() : base("DefaultConnection") { } public DbSet<User> Users { get; set; } }
И допустим, у нас есть вся инфраструктура для работы с этой моделью - представления, контроллеры, и у нас есть уже в базе данных несколько объектов данной модели. Но в какой-то момент мы решили изменить модельную базу приложения. Например, мы добавили еще одно поле в модель User:
public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
Кроме того, мы решили добавить еще одну модель, например:
public class Company { public int Id { get; set; } public string Name { get; set; } }
Таким образом, контекст данных у нас уже меняется следующим образом:
public class UserContext : DbContext { public UserContext() : base("DefaultConnection") { } public DbSet<User> Users { get; set; } public DbSet<Company> Companies { get; set; } }
Мы можем добавить в представления для модели User дополнительное поле для свойства Age, можем создать контроллер и представления для новой модели, но при попытке добавить новый объект в бд, мы будем получать ошибку:
Контекст данных изменился, и теперь нам надо провести миграцию от старой схемы базы данных к новой. И первым делом найдем внизу Visual Studio
окно Package Manager Console, введем в нем команду: enable-migrations
и нажмем Enter:
После выполнения этой команды Visual Studio в проекте будет создана папка Migrations, в которой можно найти файл Configuration.cs. Этот файл содержит объявление одноименного класса Configuration, который устанавливает настройки конфигурации:
namespace MigrationApp.Migrations { using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration<MigrationApp.Models.UserContext> { public Configuration() { AutomaticMigrationsEnabled = false; ContextKey = "MigrationApp.Models.UserContext"; } protected override void Seed(MigrationApp.Models.UserContext context) { } } }
В методе Seed можно проинициализировать базу данных начальными данными. Теперь нам надо создать саму миграцию. Там же в консоли Package Manager Console введем команду:
PM> Add-Migration "MigrateDB"
После этого Visual Studio автоматически сгенерирует класс миграции:
namespace MigrationApp.Migrations { using System; using System.Data.Entity.Migrations; public partial class MigrateDB : DbMigration { public override void Up() { CreateTable( "dbo.Companies", c => new { Id = c.Int(nullable: false, identity: true), Name = c.String(), }) .PrimaryKey(t => t.Id); AddColumn("dbo.Users", "Age", c => c.Int(nullable: false)); } public override void Down() { DropColumn("dbo.Users", "Age"); DropTable("dbo.Companies"); } } }
В методе Up
с помощью вызова метода CreateTable создается таблица "dbo.Companies" и производится ее настройка: создание столбцов,
установка ключей. И также добавляется новый столбец Age в уже имеющуюся таблицу. Метод Down
удаляет столбец и таблицу на случай, если они существуют.
Фактически эти методы равнозначные выражению ALTER в языке SQL, которое меняет структуру базы данных и ее таблиц.
И в завершении чтобы выполнить миграцию, применим этот класс, набрав в той же консоли команду:
PM> Update-Database
После этого, если мы посмотрим на состав базы данных, то увидим, что к ней были применены изменения в соответствии с выполненной миграцией:
Итак, миграция выполнена, и мы можем уже использовать обновленные модели и контекст данных.