Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Автоматическая миграция позволяет использовать первые миграции кода без наличия файла кода в проекте для каждого изменения. Не все изменения могут применяться автоматически. Например, для переименования столбцов требуется использование миграции на основе кода.
Примечание.
В этой статье предполагается, что вы умеете использовать 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', изменилась с момента создания базы данных. Рекомендуется использовать Code First Migrations для обновления базы данных (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 будет применять ожидающие миграции к базе данных.
Мы будем избегать использования Add-Migration (если это действительно необходимо) и сосредоточимся на том, чтобы миграции Code First автоматически вычисляли и применяли изменения. Давайте использовать Update-Database, чтобы применить Code First Migrations для внесения изменений в нашу модель (новое свойство Blog.Url) в базу данных.
- Выполните команду Update-Database в консоли диспетчер пакетов.
База данных MigrationsAutomaticDemo.BlogContext теперь обновляется, чтобы включить столбец URL-адреса в таблицу блогов .
Вторая автоматическая миграция
Давайте внесем еще одно изменение и пусть Code First Migrations автоматически применит изменения в базу данных за нас.
- Также добавим новый класс 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. Имя файла миграции предваряется меткой времени для упрощения упорядочивания. Давайте отредактируем созданный код, чтобы указать значение по умолчанию 3 для Blog.Rating (строка 10 в приведенном ниже коде)
Миграция также содержит файл программной части, который записывает некоторые метаданные. Эти метаданные позволят Code First Migrations воспроизвести автоматические миграции, которые мы выполнили до этой миграции, основанной на коде. Это важно, если другой разработчик хочет запустить наши миграции или когда пришло время развернуть наше приложение.
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 в консоли диспетчер пакетов.
Вернуться к автоматическим миграциям
Теперь мы можем вернуться к автоматическим миграциям для более простых изменений. Первичные миграции кода (Code First Migrations) обеспечивают выполнение автоматических и основанных на коде миграций в правильном порядке, определяемом метаданными, которые хранятся в связанном файле программного кода для каждой такой миграции.
- Давайте добавим свойство Post.Abstract в нашу модель
public string Abstract { get; set; }
Теперь мы можем использовать Update-Database , чтобы получить код first Migrations для отправки этого изменения в базу данных с помощью автоматической миграции.
- Выполните команду Update-Database в консоли диспетчер пакетов.
Итоги
В этом пошаговом руководстве вы узнали, как использовать автоматическую миграцию для отправки изменений модели в базу данных. Вы также узнали, как создавать шаблон и запускать миграции на основе кода между автоматическими миграциями, когда требуется больше управления.