Сброс миграций Entity-Framework


299

Я испортил свои миграции, я использовал IgnoreChangesпри начальной миграции, но теперь я хочу удалить все свои миграции и начать с начальной миграции со всей логикой.

Когда я удаляю миграции в папке и пытаюсь, и Add-Migrationона не генерирует полный файл (он пустой - потому что я не вносил никаких изменений со времени моей последней, но теперь удаленной миграции).

Есть ли какая - либо команда Disable-Migrations , чтобы я мог выполнить ее повторно Enable-Migrations?



3
Одно важное замечание, если у вас есть несколько строк подключения: укажите, какую из них использовать при сбросе миграций, иначе он попытается применить к обеим, что может вызвать проблемы при наличии расхождений.
— Йерун Ванневел

Примечание. Если вы не удалили свои миграции (вы правильно используете контроль версий?), Вы могли бы обновить свою базу данных до первой миграции, затем удалить смягчение и создать новые миграции с этой точки. Смотрите здесь: stackoverflow.com/a/23793384/309634
— DarcyThomas

Ответы:


446

Тебе надо :

  1. Удалить состояние: Удалить папку миграций в вашем проекте; И
  2. Удалить __MigrationHistoryтаблицу в вашей базе данных (может быть в системных таблицах); затем
  3. Выполните следующую команду в консоли диспетчера пакетов:

    Enable-Migrations -EnableAutomaticMigrations -Force

    Использовать с или без -EnableAutomaticMigrations

  4. И, наконец, вы можете запустить:

    Add-Migration Initial

5
^^ Разобрался - это была ошибка TFS - если вы используете TFS, вам нужно выполнить регистрацию перед запуском команды «Enable-Migrations ...». : D
— BrainSlugs83

7
Если вы не используете контроль версий, сохраните значения Seed перед удалением!
— RyanJMcGowan

77
@RyanJMcGowan, если вы не используете контроль версий, вы заслуживаете того, чтобы потерять свою работу. :-)
— Майк Коул

4
@Tood. +1 к этому. Сэкономил мне много времени. Теперь, если бы только команда EF могла включить все это в команду Reset-Migrations. Может быть, EF 6 ...
— Джеральд Дэвис

24
Для существующей базы данных вам необходимо закомментировать содержимое функции «Вверх». В противном случае вы получите ошибку при запуске «Update-Database», он будет жаловаться, что таблица уже существует
— Гай,

149

Проблема: вы испортили свои миграции и хотели бы сбросить их, не удаляя существующие таблицы.

Проблема: Вы не можете сбросить миграции с существующими таблицами в базе данных, так как EF хочет создать таблицы с нуля.

Что делать:

  1. Удалить существующие миграции из таблицы Migrations_History.

  2. Удалите существующие миграции из папки миграции.

  3. Запустите add -igration Reset. Это создаст миграцию в папке Migration, которая включает в себя создание таблиц (но она не будет запускаться, поэтому не будет возникать ошибка).

  4. Теперь вам нужно создать начальную строку в таблице MigrationHistory, чтобы у EF был снимок текущего состояния. EF сделает это, если вы примените миграцию. Однако вы не можете применить перенесенную миграцию, поскольку таблицы уже существуют в вашей базе данных. Итак, перейдите в раздел «Миграция» и закомментируйте весь код внутри метода «Up».

  5. Теперь запустите update-database. Он применяет миграцию (но фактически не изменяет базу данных) и создает строку снимка в MigrationHistory.

Теперь вы сбросили свои миграции и можете продолжить обычные миграции.


11
Это единственный ответ, который работал для меня. Принятый ответ, похоже, не решает проблему того, что происходит, когда вы запускаете Update-Database или запускаете свое приложение (в зависимости от того, какой тип инициализатора вы используете). Он попытается запустить миграцию и попытаться внести изменения, которые уже существуют. Если я что-то упустил.
— обычная игра

2
Это также более гибкий ответ. В моем случае были некоторые изменения, которые мне нужно было применить, а некоторые нет. Я мог бы просто сохранить полезные вещи в моем Up ().
— tec-goblin

1
@ H.Джонсон, я посмотрел на это. У вас был вопрос по этому поводу?
— Грег Гам

2
Следует помнить одну вещь: в EF 6.0 таблица _MigrationsHistory содержит миграции для нескольких DBContexts. Удаление может вызвать проблемы, вы должны удалять только те строки, где ContextKey = имя вашей миграции. Кроме того, после 2 выше мне пришлось снова включить-миграции
— Дэвид Уотерворт

2
По сути тот же ответ, с расширенным примером (со скриншотами): weblog.west-wind.com/posts/2016/Jan/13/…
— nmit026

30

Как насчет

Update-Database –TargetMigration: $InitialDatabase

в консоли диспетчера пакетов? Он должен сбросить все обновления до самого раннего состояния.

Ссылка: Code First Migrations - Миграция в конкретную версию (включая понижение версии)


Я думаю, что моим главным разочарованием было уже не доверять миграциям для точного поддержания государства. И в результате хочется начать с нуля.
— Тодд

@ Тодд, я споткнулся, и не всегда было понятно, нужно ли мне удалять файлы миграции, чтобы начать все сначала. Теперь он работает следующим образом: 1. вернуться к исходному состоянию с помощью команды «Update-Database –TargetMigration: $ InitialDatabase». 2. Удалите все файлы миграции (названные с помощью yyyyMMddHHmmssx_Name.cs или .vb). 3. Обновите обновление, используя 'add-Migration -Name some_name'. 4. Выпустите обновление, чтобы повлиять на вашу базу данных, используя «update-Database». Надеюсь, это работает для вас.
— Крис Воон

В моем случае предложенная команда в этом ответе привела к ошибкам SQL.
— Джастин Скилз

что это должно означать "InitialDatabase"? удалит ли он таблицы или столбцы, уже созданные в БД?
— Серж

16

Чтобы это исправить, вам необходимо:

  1. Удалите все файлы * .cs в папке миграции.

  2. Удалить таблицу _MigrationHistory в базе данных

  3. Бегать Enable-Migrations -EnableAutomaticMigrations -Force

  4. Бегать Add-Migration Reset

Затем в public partial class Reset : DbMigrationклассе необходимо прокомментировать все существующие и текущие таблицы:

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

Если вы пропустите этот бит все не получится, и вам придется начинать заново!

  1. Сейчас беги Update-Database -verbose

Это должно быть успешным, если вы сделали все правильно, и теперь вы можете продолжать как обычно.


2
Вместо того, чтобы комментировать все, вы также можете просто написать «возврат»; в первой строке метода Up ().
— Цепная лестница

6

Учитывая, что это все еще проявляется, когда мы ищем EF в .NET Core, я опубликую свой ответ здесь (так как он часто преследует меня). Обратите внимание, что в версии EF 6 .NET есть некоторые тонкости (нет начальной команды, и вам нужно будет удалить файлы «Снимок»).

(Проверено в .NET Core 2.1)

Вот шаги:

  1. Удалить _efmigrationhistoryтаблицу.
  2. Найдите в своем решении все файлы, содержащие в своем имени снимок , например ApplicationDbContextSnapshot.cs, и удалите их.
  3. Восстановите свое решение
  4. Бегать Add-Migration InitialMigration

Обратите внимание: вы должны удалить ВСЕ файлы снимков . Я потратил бесчисленные часы, просто удаляя базу данных ... Это создаст пустую миграцию, если вы этого не сделаете.

Кроме того, в # 3 вы можете просто назвать свою миграцию как хотите.

Вот некоторые дополнительные ресурсы: asp.net CORE Миграции генерируются пустыми

Сбросить Entity Framework 7 миграций


3

В EntityFramework 6, пожалуйста, попробуйте:

Add-Migration Initial

для того, чтобы обновить исходный файл миграции.


3

В Entity Framework Core.

  1. Удалите все файлы из папки миграций.
  2. Введите в консоли

база данных dotnet ef drop -f -v

dotnet ef миграции добавить начальный

обновление базы данных dotnet ef


2

Моя проблема оказалась в том, что я вручную удалил папку Migrations. Я сделал это, потому что хотел создать резервную копию содержимого, поэтому я просто перетащил папку из проекта. Позже я исправил проблему, вернув ее обратно (после создания резервной копии), затем удалив папку «Миграции», щелкнув ее правой кнопкой мыши в обозревателе решений и выбрав «Удалить» во всплывающем меню.


1

В EF6

  1. Удалите все ваши файлы в папке «migrations» ... Но не в «initial create» или «config».
  2. Удалить базу данных.
  3. Теперь беги Add-Migration Initial.
  4. Теперь вы можете «обновить базу данных» и все будет хорошо.

1

Удалить в Migrationsпапку, а Cleanзатем Rebuildпроект. Это сработало для меня. Перед чисткой и перестройкой говорилось, что миграция уже существует, поскольку в кэшированной памяти она еще не удалена.


0

Этот метод не требует удаления __MigrationHistoryтаблицы, поэтому вам не нужно прикладывать руки к базе данных при развертывании.

  1. Удалите существующие миграции из папки «Миграции».
  2. В консоли диспетчера пакетов запустите Add-Migration ResetMigrations
  3. Очистить историю миграции в Up()методе:
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}

0

В Net Core 3.0:

Я не смог найти способ сбросить миграции .

Я также столкнулся с проблемами с нарушенной миграцией, и ответы, предоставленные здесь, не работали для меня. У меня есть веб-API .Net Core 3.0, и где-то в прошлом месяце я редактировал базу данных напрямую. Да, я сделал плохо, плохо.

Предлагаемые здесь стратегии привели к ряду ошибок в консоли диспетчера пакетов:

  • Миграция с таким именем уже существует
  • Не удалось найти снимок
  • «Сила» не является признанным параметром

Конечно, я мог пропустить шаг или пропустить очистку правильных файлов, но я обнаружил, что есть способы убрать это без такой грубой силы:

  • Remove-Migration из PMC для каждой миграции по имени, в обратном порядке создания, вплоть до прерванной миграции
  • Add-Migration для создания новой миграции, которая будет дельтой между последней удачной миграцией и текущей схемой

Теперь, когда веб-API запускается с пустой базой данных, он правильно создает все таблицы и свойства, соответствующие моделям сущностей.

НТН!



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.