Миграция баз данных

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Нередко возникает ситуация, когда модель меняется. Например, мы решили внести в нее новые свойства. Но при этом у нас уже имеется существующая база данных, в которой есть какие-то данные. И чтобы без потерь обновить базу данных 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

После этого, если мы посмотрим на состав базы данных, то увидим, что к ней были применены изменения в соответствии с выполненной миграцией:

Итак, миграция выполнена, и мы можем уже использовать обновленные модели и контекст данных.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850