Автоматическая миграция кода
Автоматическая миграция позволяет использовать первые миграции кода без наличия файла кода в проекте для каждого изменения. Не все изменения могут применяться автоматически. Например, для переименования столбцов требуется использование миграции на основе кода.
Примечание.
В этой статье предполагается, что вы знаете, как использовать code First Migrations в основных сценариях. Если вы этого не сделали, прежде чем продолжить, вам потребуется прочитать code First Migrations .
Рекомендация по средам группы
Вы можете перемежать автоматические и кодовые миграции, но это не рекомендуется в сценариях разработки команд. Если вы являетесь частью команды разработчиков, использующих управление версиями, следует либо использовать исключительно автоматическую миграцию, либо только миграцию на основе кода. Учитывая ограничения автоматической миграции, мы рекомендуем использовать миграции на основе кода в средах команд.
Привязка начальной модели и базы данных
Прежде чем мы начнем использовать миграции, нам потребуется проект и модель Code First, с которой мы будем работать. В этом пошаговом руководстве мы собираемся использовать каноническую модель Blog и Post.
- Создание консольного приложения MigrationsAutomaticDemo
- Добавьте последнюю версию пакета NuGet EntityFramework в проект
- Средства —> Диспетчер пакетов библиотеки —> Консоль диспетчера пакетов
- Запустите команду EntityFramework Install-Package
- Добавьте файл Model.cs с кодом, показанным ниже. Этот код определяет один класс Blog, составляющий нашу модель предметной области, и класс BlogContext, который будет нашим контекстом 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; }
}
}
- Теперь, когда у нас есть модель, пора использовать ее для доступа к данным. Внесите в файл Program.cs приведенный ниже код.
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();
}
}
}
Запустите приложение, и вы увидите, что для вас создается база данных MigrationsAutomaticCodeDemo.BlogContext .
Включение миграций
Пора внести дополнительные изменения в нашу модель.
- Давайте внесем в класс Blog свойство Url.
public string Url { get; set; }
Если вы снова запустите приложение, вы получите invalidOperationException, заявив, что модель, резервная копия контекста BlogContext изменилась с момента создания базы данных. Рекомендуется использовать кодовые миграции для обновления базы данных (http://go.microsoft.com/fwlink/?LinkId=238269).
Как видно из исключения, пора приступить к использованию Code First Migrations. Так как мы хотим использовать автоматические миграции, мы будем указывать переключатель -EnableAutomaticMigrations .
Выполните команду Enable-Migrations –EnableAutomaticMigrations в консоли диспетчер пакетов Эта команда добавила папку Migrations в наш проект. Эта новая папка содержит один файл:
Класс конфигурации. Этот класс позволяет настраивать поведение миграций для контекста. В этом пошаговом руководстве мы будем просто использовать конфигурацию по умолчанию. Поскольку имеется только один контекст Code First в проекте, Enable-Migrations автоматически заполняет тип контекста, к которому относится эта конфигурация.
Первая автоматическая миграция
Вам нужно знать о двух основных командах Code First Migrations.
- Add-Migration будет автоматически формировать следующую миграцию на основе изменений, внесенных в модель с момента создания последней миграции.
- Update-Database будет применять ожидающие обработки миграции к базе данных.
Мы будем избегать использования надстройки (если мы действительно не должны) и сосредоточимся на том, чтобы разрешить код первым миграциям автоматически вычислять и применять изменения. Давайте используем Update-Database , чтобы получить миграцию кода для отправки изменений в нашу модель (новое свойство Blog.Url) в базу данных.
- Выполните команду Update-Database в консоли диспетчер пакетов.
База данных MigrationsAutomaticDemo.BlogContext теперь обновляется, чтобы включить столбец URL-адреса в таблицу блогов .
Вторая автоматическая миграция
Давайте добавим другое изменение и автоматически перенесите изменения в базу данных.
- Также добавим новый класс 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; }
}
- Еще мы добавим коллекцию Posts в класс Blog, чтобы создать второй конец связи между Blog и Post.
public virtual List<Post> Posts { get; set; }
Теперь используйте Update-Database , чтобы обновить базу данных. Давайте укажем флаг –Verbose, чтобы вы могли видеть SQL, который выполняет Code First Migrations.
- Запустите команду Update-Database –Verbose в консоли диспетчера пакетов.
Добавление миграции на основе кода
Теперь рассмотрим то, что может потребоваться использовать миграцию на основе кода.
- Давайте добавим свойство Rating в класс Блога
public int Rating { get; set; }
Мы могли бы просто запустить Update-Database , чтобы отправить эти изменения в базу данных. Однако мы добавляем столбец Blogs.Rating , если в таблице есть существующие данные, они будут назначены clR по умолчанию для нового столбца (рейтинг является целым числом, поэтому будет равно 0). Но нам нужно указать значение по умолчанию 3, чтобы существующие строки в таблице Blogs начинались с неплохой оценки. Давайте используем команду Add-Migration для записи этого изменения в миграцию на основе кода, чтобы мы могли изменить ее. Команда Add-Migration позволяет нам дать эти миграции имя, давайте просто вызовем наш AddBlogRating.
- Выполните команду Add-Migration AddBlogRating в консоли диспетчер пакетов.
- В папке Migrations теперь у нас есть новая миграция AddBlogRating . Имя файла миграции предварительно исправлено с меткой времени для упорядочения. Давайте отредактируем созданный код, чтобы указать значение по умолчанию для Blog.Rating (строка 10 в приведенном ниже коде)
Миграция также содержит файл программной части, который записывает некоторые метаданные. Эти метаданные позволят сначала выполнить миграцию кода для репликации автоматических миграций, выполняемых перед миграцией на основе кода. Это важно, если другой разработчик хочет запустить наши миграции или когда пришло время развернуть наше приложение.
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");
}
}
}
Измененная миграция выглядит прекрасно, так что давайте обновим ее с помощью команды Update-Database.
- Выполните команду Update-Database в консоли диспетчер пакетов.
Вернуться к автоматическим миграциям
Теперь мы можем вернуться к автоматическим миграциям для более простых изменений. При первой миграции кода выполняется автоматическая миграция на основе кода в правильном порядке на основе метаданных, хранящиеся в файле программной части для каждой миграции на основе кода.
- Давайте добавим свойство Post.Abstract в нашу модель
public string Abstract { get; set; }
Теперь мы можем использовать Update-Database , чтобы получить код first Migrations для отправки этого изменения в базу данных с помощью автоматической миграции.
- Выполните команду Update-Database в консоли диспетчер пакетов.
Итоги
В этом пошаговом руководстве вы узнали, как использовать автоматическую миграцию для отправки изменений модели в базу данных. Вы также узнали, как создавать шаблон и запускать миграции на основе кода между автоматическими миграциями, когда требуется больше управления.