Настройка таблицы журнала миграций
Примечание.
Только в EF6 и более поздних версиях. Функции, API и другие возможности, описанные на этой странице, появились в Entity Framework 6. При использовании более ранней версии могут быть неприменимы некоторые или все сведения.
Примечание.
В этой статье предполагается, что вы знаете, как использовать code First Migrations в основных сценариях. Если вы этого не сделали, прежде чем продолжить, вам потребуется прочитать code First Migrations .
Что такое таблица журнала миграций?
Таблица журнала миграций — это таблица, используемая code First Migrations для хранения сведений о миграции, примененных к базе данных. По умолчанию имя таблицы в базе данных __MigrationHistory и создается при применении первой миграции к базе данных. В Entity Framework 5 эта таблица была системной таблицей, если приложение использовало базу данных Microsoft Sql Server. Это изменилось в Entity Framework 6, однако таблица журнала миграций больше не помечена системной таблицей.
Зачем настраивать таблицу журнала миграций?
Таблица журнала миграций должна использоваться исключительно при первой миграции кода и ее изменение вручную может нарушить миграцию. Однако иногда конфигурация по умолчанию не подходит и таблица должна быть настроена, например:
- Чтобы включить поставщик миграций 3-й стороны, необходимо изменить имена и (или) аспекты столбцов.
- Вы хотите изменить имя таблицы.
- Для таблицы __MigrationHistory необходимо использовать схему, не используемую по умолчанию.
- Необходимо сохранить дополнительные данные для заданной версии контекста, поэтому необходимо добавить дополнительный столбец в таблицу.
Слова предосторожности
Изменение таблицы журнала миграции является мощным, но необходимо быть осторожным, чтобы не переусердствовать. В настоящее время среда выполнения EF не проверка совместима ли настраиваемая таблица журнала миграций с средой выполнения. Если приложение не может нарушить среду выполнения или вести себя непредсказуемо. Это еще более важно, если вы используете несколько контекстов для каждой базы данных, в этом случае несколько контекстов могут использовать одну таблицу журнала миграции для хранения сведений о миграции.
Как настроить таблицу журнала миграций?
Перед началом работы необходимо знать, что можно настроить таблицу журнала миграций только перед применением первой миграции. Теперь к коду.
Сначала необходимо создать класс, производный от класса System.Data.Entity.Migrations.History.HistoryContext. Класс HistoryContext является производным от класса DbContext, поэтому настройка таблицы журнала миграций очень похожа на настройку моделей EF с помощью api fluent. Необходимо просто переопределить метод OnModelCreating и использовать простой API для настройки таблицы.
Примечание.
Обычно при настройке моделей EF не требуется вызывать базу. OnModelCreating() из переопределенного метода OnModelCreating, так как dbContext.OnModelCreating() имеет пустое тело. Это не так при настройке таблицы журнала миграций. В этом случае первое, что нужно сделать в переопределении OnModelCreating(), — это фактически вызвать базу. 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");
}
}
}
После того как пользовательский журналContext будет готов к использованию 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-Migrations и, наконец, Update-Database. Это приведет к добавлению в базу данных таблицы журнала миграций, настроенной в соответствии с сведениями, указанными в производном классе HistoryContext.