Сброс миграций 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.