Настройка таблицы журнала миграций

Замечание

EF6 и более поздние версии — функции, API и т. д., рассмотренные на этой странице, были представлены в Entity Framework 6. Если вы используете более раннюю версию, некоторые или все сведения не применяются.

Замечание

В этой статье предполагается, что вы умеете использовать Code First Migrations в основных сценариях. Если вы этого не сделали, прежде чем продолжить, вам потребуется прочитать code First Migrations .

Что такое таблица журнала миграций?

Таблица журнала миграций — это таблица, используемая Code First Migrations для хранения сведений о миграциях, примененных к базе данных. По умолчанию имя таблицы в базе данных — __MigrationHistory, и она создается при применении первой миграции к базе данных. В Entity Framework 5 эта таблица была системной таблицей, если приложение использовало базу данных Microsoft Sql Server. Это изменилось в Entity Framework 6, однако таблица журнала миграций больше не помечена системной таблицей.

Зачем настраивать таблицу журнала миграций?

Таблица истории миграций предназначена исключительно для использования Code First Migrations, и ее изменение вручную может привести к проблемам с миграциями. Однако иногда конфигурация по умолчанию не подходит и таблица должна быть настроена, например:

  • Чтобы обеспечить совместимость с поставщиком миграций третьей стороны, необходимо изменить имена и (или) аспекты столбцов.
  • Вы хотите изменить имя таблицы.
  • Для таблицы __MigrationHistory необходимо использовать схему, не используемую по умолчанию.
  • Необходимо сохранить дополнительные данные для заданной версии контекста, поэтому необходимо добавить дополнительный столбец в таблицу.

Слова предосторожности

Изменение таблицы истории миграции обладает мощными возможностями, но следует соблюдать осторожность, чтобы не переусердствовать. Среда выполнения EF в настоящее время не проверяет, совместима ли настраиваемая таблица журнала миграций с средой выполнения. Если этого не произойдет, ваше приложение может выйти из строя во время выполнения или вести себя непредсказуемо. Это еще более важно, если вы используете несколько контекстов для каждой базы данных, в этом случае несколько контекстов могут использовать одну таблицу журнала миграции для хранения сведений о миграции.

Как настроить таблицу журнала миграций?

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

Сначала необходимо создать класс, производный от класса System.Data.Entity.Migrations.History.HistoryContext. Класс HistoryContext является производным от класса DbContext, поэтому настройка таблицы журнала миграций очень похожа на настройку моделей EF с помощью api fluent. Необходимо просто переопределить метод OnModelCreating и использовать простой API для настройки таблицы.

Замечание

Обычно при настройке моделей EF не требуется вызывать базовый метод OnModelCreating() из переопределенного метода OnModelCreating, так как DbContext.OnModelCreating() имеет пустое тело. Это не так при настройке таблицы журнала миграций. В этом случае первое, что нужно сделать в переопределении OnModelCreating(), — это фактически вызвать base.OnModelCreating(). Настроится таблица истории миграций по умолчанию, которую вы затем настраиваете в методе переопределения.

Предположим, вы хотите переименовать таблицу журнала миграций и поместить ее в настраиваемую схему с именем admin. Кроме того, DBA хотела бы переименовать столбец MigrationId в Migration_ID.  Это можно сделать, создав следующий класс, производный от HistoryContext:

    using System.Data.Common;
    using System.Data.Entity;
    using System.Data.Entity.Migrations.History;

    namespace CustomizableMigrationsHistoryTableSample
    {
        public class MyHistoryContext : HistoryContext
        {
            public MyHistoryContext(DbConnection dbConnection, string defaultSchema)
                : base(dbConnection, defaultSchema)
            {
            }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Entity<HistoryRow>().ToTable(tableName: "MigrationHistory", schemaName: "admin");
                modelBuilder.Entity<HistoryRow>().Property(p => p.MigrationId).HasColumnName("Migration_ID");
            }
        }
    }

После того как пользовательский HistoryContext будет готов, нужно зарегистрировать его через конфигурацию на основе кода, чтобы EF его распознал.

    using System.Data.Entity;

    namespace CustomizableMigrationsHistoryTableSample
    {
        public class ModelConfiguration : DbConfiguration
        {
            public ModelConfiguration()
            {
                this.SetHistoryContext("System.Data.SqlClient",
                    (connection, defaultSchema) => new MyHistoryContext(connection, defaultSchema));
            }
        }
    }

Вот, в общем-то, и всё. Теперь вы можете перейти в консоль диспетчера пакетов, выполнить команду Enable-Migrations, добавить миграцию с помощью Add-Migration, а затем обновить базу данных командой Update-Database. Это приведет к добавлению в базу данных таблицы журнала миграций, настроенной в соответствии с сведениями, указанными в производном классе HistoryContext.

Таблица журнала миграций