Entity Framework code-first: миграция завершается неудачно с update-database, вызывает ненужную (?) Add-миграцию
У меня есть забавный эффект, используя миграцию (EF 5.0) и первый код:
Я создал несколько моделей с первичными ключами GUID. (Кстати: для меня важно, что SQL Server использует NEWSEQUENTIALID()
, который, кажется, значение по умолчанию в текущей версии)
В какой-то момент я активировал миграции. Я добавил немного кода в начальную миграцию, это в основном .Index()
по мере необходимости.
Когда я удаляю базу данных и вызываю update-database, я получаю следующую ошибку:
Невозможно обновить базу данных в соответствии с текущей моделью, поскольку есть ожидающие изменения и автоматическая миграция отключена. Либо запишите ожидающие изменения модели в миграцию на основе кода, либо включите автоматическую миграцию. Установите в DbMigrationsConfiguration.AutomaticMigrationsEnabled значение true, чтобы включить автоматическую миграцию. Вы можете использовать команду Add-Migration для записи ожидающих изменений модели в миграцию на основе кода.
Я старался AutomaticMigrationsEnabled = true
, который работал без изменения или добавления чего-либо!
Но так как я не хочу AutomaticMigrationsEnabled
Я также попытался удалить базу снова, вызвал update-database
а потом add-migration
, Я закончил с дополнительной миграцией, которая, кажется, ничего не меняет (см. Ниже). Я также попытался добавить эти строки в нижней части начальной миграции - но это ничего не меняет.
Одна из моделей:
[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
public const String TABLENAME = "Speaker";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
public string Name { get; set; }
}
Исходный код миграции:
public partial class InitialCreate : DbMigration
{
public override void Up()
{
// [...]
CreateTable(
"dbo.Speaker",
c => new
{
Id = c.Guid(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 50),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, true, false); // added manually: unique Name
// [...]
}
}
internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(MyProject.Repositories.DBContext context)
{
// ...
}
}
Ниже приведен код, созданный с помощью add-igration: похоже, он ничего нового не делает - может быть, я что-то упустил?
public partial class UnneccessaryMigration : DbMigration
{
public override void Up()
{
// isn't this the exact same code from InitialMigrations?
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true));
// ...
}
public override void Down()
{
//...
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false));
}
}
Поэтому мне любопытно: что я сделал, чтобы дезориентировать миграции? И что я могу сделать, чтобы заставить это работать только с одной начальной миграцией?
Решение: Следующий обходной путь сделал это для меня:
- Я удалил базу данных и все миграции, как описано здесь: /questions/8216496/sbros-migratsij-entity-framework/8216503#8216503
- Выполнено Enable-Migrations + Add-Migration Initial
- Слил мои изменения.Index() ручной работы в файл. Теперь Update-Database работает снова - также многократно, при удалении базы.
3 ответа
Я также попытался снова удалить базу данных, которая называется update-database и затем add-igration. Я закончил с дополнительной миграцией, которая, кажется, ничего не меняет (см. Ниже)
Исходя из вышеизложенного, я думаю, что вы сделали в первую очередь. Если вы бежите Update database
до Add-migration
, он не будет обновлять базу данных с вашими схемами миграции. Сначала вам нужно добавить миграцию, а затем запустить команду обновления.
Попробуйте их в этом порядке, используя консоль диспетчера пакетов.
PM> Enable-migrations //You don't need this as you have already done it
PM> Add-migration Give_it_a_name
PM> Update-database
У Entity Framework есть некоторые проблемы, связанные с полями идентификации.
Вы не можете добавить идентификатор GUID на существующую таблицу
Миграции: не обнаруживает изменений в DatabaseGeneratedOption
Ни один из них точно не описывает вашу проблему, и метод Down() в вашей дополнительной миграции интересен, поскольку он пытается удалить IDENTITY из столбца, когда ваш CREATE TABLE в начальной миграции, кажется, устанавливает его!
Кроме того, если вы используете Update-Database -Script
или же Update-Database -Verbose
чтобы просмотреть sql, который запускается из этих AlterColumn
методы вы увидите, что sql идентичен в Up
а также Down
и на самом деле ничего не делает. IDENTITY остается неизменным (для текущей версии - EF 6.0.2 и ниже) - как описано в первых 2 проблемах, с которыми я связан.
Я думаю, что вы должны удалить избыточный код в вашей дополнительной миграции и сейчас жить с пустой миграцией. И вы можете подписаться на / голосовать за вопросы, подлежащие решению.
Рекомендации:
Смена опции IDENTITY делает приседания
Включение / выключение идентификации с помощью пользовательской операции миграции
Попробуй это:
PM> Enable-migrations -force
PM> Add-migration MigrationName
PM> Update-database -force
У меня была эта проблема, и приведенные выше предложения не помогли. Я обнаружил, что добавление-миграция считывает текущее состояние и создает подпись текущей модели. Вы должны изменить свою модель перед изменением. Итак, последовательность такая.
- Изменить модель
- запустить добавление-миграцию
Я сделал обратное и добавил миграцию перед изменением моей модели (которая была пустой, поэтому я добавил новые столбцы), а затем запустил свой код.
Надеюсь это поможет.
Для меня я решил это следующим образом В Visual Studio 2015: В меню "Вид" выберите "Другие окна", затем "Консоль диспетчера пакетов" и выполните следующие команды:
PM> enable-migrations
Миграции уже включены в проекте mvcproject. Чтобы перезаписать существующую конфигурацию миграции, используйте параметр -Force.
PM> enable-migrations -Force
Проверка, нацелен ли контекст на существующую базу данных... Включены первые миграции кода для проекта mvcproject.
затем добавьте имя миграции в папку миграции, он добавит нужный класс в обозревателе решений, выполнив следующую команду
PM>Add-migration AddColumnUser
Наконец обновите базу
PM> update-database
В ответ на ваш общий вопрос о
Так что мне любопытно: что я сделал, чтобы дезориентировать миграции? И что я могу сделать, чтобы он заработал всего за одну начальную миграцию?
У меня только что появилось такое же сообщение об ошибке, как и у вас, после того, как я объединил несколько веток и при миграции запутались в текущем состоянии базы данных. Хуже всего то, что это происходило только на сервере клиента, а не в наших системах разработки.
Пытаясь понять, что там происходит, я наткнулся на это превосходное руководство от Microsoft:
Руководство Microsoft по переносу кода сначала в командную среду
Хотя это руководство было написано для объяснения миграции в командах, оно также дает лучшее объяснение, которое я нашел, о том, как миграции работают внутри, что вполне может привести к объяснению поведения, которое вы видите. Очень стоит выделить час на то, чтобы прочитать все это всем, кто работает с EF6 или ниже.
Для тех, кто задал этот вопрос этим сообщением об ошибке после слияния миграций, трюк с генерацией пустой миграции с текущим состоянием базы данных решил проблему для меня, но обязательно прочитайте все руководство, чтобы узнать, является ли это решение уместно в вашем случае.
When using VS2019, MVC5 - look under Migrations folder for file Configuration.cs Edit: AutomaticMigrationsEnabled = true
-
-
Я так понимаю, это очень старая ветка. Тем не менее, хотел поделиться, как я столкнулся с сообщением в своем сценарии, и в случае, если это может помочь другим
- Я создал
Add-Migration <Migration_name>
на моей локальной машине. Не запускалupdate-database
еще. - Между тем, в родительской ветке была серия коммитов, которые я должен объединить. У слияния также была миграция на него, и когда я исправил конфликты, у меня появилось 2 миграции, которые добавляются в мой проект, но не выполняются через
update-database
. - Сейчас не использую
enable-migrations -force
в моем приложении. Я предпочитаю выполнитьupdate-database -script
команда для управления целевыми миграциями, которые мне нужны. - Итак, когда я попытался выполнить указанную выше команду, я получил указанную ошибку.
Моим решением было запустить
update-database -Script -TargetMigration <migration_name_from_merge>
а потом мой
update-database -Script -TargetMigration <migration_name>
который сгенерировал 2 сценария, которые я смог запустить вручную на моей локальной базе данных.
Излишне говорить, что вышеупомянутый опыт находится на моей локальной машине.
Если вы сначала установите свою контекстную модель как код на основе существующей базы данных, поэтому вам нужно установить миграцию:
Add-Migration InitialCreate –IgnoreChanges
Update-database -force
а затем измените свою контекстную модель и установите:
Add-migration RemoveIspositive
Update-database -force