EF Code First Migrations работает с ошибкой DbMigrator.Update - PullRequest
0 голосов
/ 21 мая 2019

В моем ASP.NET MVC Web App, поддерживаемом EF Code. Сначала, используя EF Migrations, мне нужно лучше контролировать обновления БД, делая их полуавтоматическими. Цель состоит в том, чтобы запустить их только из кода (например, запустив DbMigrator.Update()), но если он не запущен, приложение все равно должно выполняться, игнорируя возможные изменения.

Для этого я устанавливаю DbMigrationsConfiguration.AutomaticMigrationsEnabled на false, но при первом доступе к базе данных я получаю следующее исключение:

System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException : 'Невозможно обновить базу данных в соответствии с текущей моделью, поскольку имеются ожидающие изменения и автоматическая миграция отключена. Либо запишите ожидающие изменения модели в миграцию на основе кода, либо включите автоматическую миграцию. Установите для DbMigrationsConfiguration.AutomaticMigrationsEnabled значение true, чтобы включить автоматическую миграцию. '

Хорошая часть: я смог опустить исключение, установив disableDatabaseInitialization="true" в Web.config как , описанное в MSDN (я не нашел другого способа работы).

Я запускаю следующий код в пользовательском триггере:

var config = new DbMigrationsConfiguration<MyContext>
{
    AutomaticMigrationsEnabled = false,
    AutomaticMigrationDataLossAllowed = false,
    MigrationsAssembly = Assembly.GetAssembly(typeof(InitialCreate)),
    MigrationsNamespace = typeof(InitialCreate).Namespace
};

var migrator = new DbMigrator(config);

migrator.Update(); // throws Exception

Вызывает обновление вызова:

System.Data.SqlClient.SqlException : 'В базе данных уже есть объект с именем' MyEntity '.'

Это может быть связано с использованием disableDatabaseInitialization. Кроме того, вызов migrator.GetLocalMigrations() перечисляет все Миграции, но migrator.GetDatabaseMigrations() не перечисляет ни одного (пусто), в то время как уже применены некоторые Миграции.

Можете ли вы определить ошибку?

1 Ответ

0 голосов
/ 22 мая 2019

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

var config = new DbMigrationsConfiguration<MyContext>
{
    AutomaticMigrationsEnabled = false,
    AutomaticMigrationDataLossAllowed = false,
    MigrationsAssembly = Assembly.GetAssembly(typeof(InitialCreate)),
    MigrationsNamespace = typeof(InitialCreate).Namespace,

    ContextKey = nameof(MyContext) // Fixed the issue
};

Очень интересно, что я должен установить все поля самостоятельно. В найденных мной примерах людям не нужно ничего настраивать.

...