Сброс миграций Entity-Framework
Я испортил свои миграции, я использовал IgnoreChanges
на начальной миграции, но теперь я хочу удалить все свои миграции и начать с начальной миграции со всей логикой.
Когда я удаляю миграции в папке и пытаюсь Add-Migration
он не генерирует полный файл (он пустой - потому что я не вносил никаких изменений со времени моей последней, но теперь удаленной миграции).
Есть ли какая - нибудь команда Disable-Migrations, чтобы я мог выполнить ее заново? Enable-Migrations
?
18 ответов
Вам нужно:
- Удалить состояние: Удалить папку миграций в вашем проекте; А также
- Удалить
__MigrationHistory
таблица в вашей базе данных (может быть в системных таблицах); затем Выполните следующую команду в консоли диспетчера пакетов:
Enable-Migrations -EnableAutomaticMigrations -Force
Использовать с или без
-EnableAutomaticMigrations
И, наконец, вы можете запустить:
Add-Migration Initial
Проблема: вы испортили свои миграции и хотели бы сбросить их, не удаляя существующие таблицы.
Проблема: Вы не можете сбросить миграции с существующими таблицами в базе данных, так как EF хочет создавать таблицы с нуля.
Что делать:
Удалить существующие миграции из таблицы Migrations_History.
Удалите существующие миграции из папки миграции.
Запустите add-миграцию Reset. Это создаст миграцию в папке Migration, которая включает в себя создание таблиц (но она не запустится, поэтому не выдаст ошибку).
Теперь вам нужно создать начальную строку в таблице MigrationHistory, чтобы у EF был снимок текущего состояния. EF сделает это, если вы примените миграцию. Однако вы не можете применить миграцию, которую вы только что сделали, поскольку таблицы уже существуют в вашей базе данных. Итак, перейдите в раздел "Миграция" и закомментируйте весь код внутри метода "Up".
Теперь запустите update-database. Он применяет миграцию (но фактически не изменяет базу данных) и создает строку снимка в MigrationHistory.
Теперь вы сбросили свои миграции и можете продолжить обычные миграции.
В Entity Framework Core.
- Удалите все файлы из папки миграций.
- Введите в консоли
база данных dotnet ef отбрасывает -f -v
dotnet ef миграции добавить начальный
обновление базы данных dotnet ef
Как насчет
Update-Database –TargetMigration: $InitialDatabase
в консоли диспетчера пакетов? Он должен сбросить все обновления до самого раннего состояния.
Ссылка по ссылке: Code First Migrations - Миграция в конкретную версию (включая понижение версии)
Чтобы это исправить, вам необходимо:
Удалите все файлы *.cs в папке миграции.
Удалить таблицу _MigrationHistory в базе данных
Бежать
Enable-Migrations -EnableAutomaticMigrations -Force
Бежать
Add-Migration Reset
Затем в public partial class Reset : DbMigration
класс, вам нужно прокомментировать все существующие и текущие таблицы:
public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}
Если вы пропустите этот бит все не получится, и вам придется начинать заново!
- Сейчас беги
Update-Database -verbose
Это должно быть успешным, если вы сделали все правильно, и теперь вы можете продолжать как обычно.
Учитывая, что это все еще проявляется, когда мы ищем EF в.NET Core, я опубликую свой ответ здесь (так как он часто преследует меня). Обратите внимание, что в версии EF 6 .NET есть некоторые тонкости (нет начальной команды, и вам нужно будет удалить файлы "Снимок").
(Проверено в.NET Core 2.1)
Вот шаги:
- Удалить
_efmigrationhistory
Таблица. - Найдите полное решение для файлов, которые содержат в своем имени снимок, например:
ApplicationDbContextSnapshot.cs
и удалите их. - Бежать
Add-Migration InitialMigration
Обратите внимание:вы должны удалить ВСЕ файлы снимков. Я потратил бесчисленные часы, просто удаляя базу данных... Это создаст пустую миграцию, если вы этого не сделаете.
Кроме того, в #3 вы можете просто назвать свою миграцию как хотите.
Вот некоторые дополнительные ресурсы: asp.net CORE Миграции генерируются пустыми
Для EFCore 6/7:
Чтобы объединить все изменения с течением времени обратно в один файл и применить его к существующим базам данных, сохраняя при этом все данные (т.е. в производстве и других разработчиках), эти шаги сработали для меня:
- Удалите существующие миграции из
Migrations
Папка в вашем проекте. - Удалите файлы Context Snapshop. то есть
ApplicationDbContextSnapshot.cs
,DatabaseContextModelSnapshot.cs
или похожие. - Перестройте свое решение
- Бегать
Add-Migration Initial
. (Может называться как угодно вместоInitial
). Это создаст миграцию в вашей папке Migration, которая включает создание таблиц, но еще не будет применена. - Откройте сгенерированный файл миграции и
comment out all the code inside the "Up" method
, чтобы он не вносил изменений во все ваши существующие таблицы. (Это позволяет нам обновить базу данных в правильном формате, не внося никаких изменений на следующем шаге) - Перед закомментированным кодом в функции Up добавьте, чтобы удаление/усечение применялось во время миграции.
public partial class Initial : Migration
{
public override void Up()
{
migrationBuilder.Sql("DELETE FROM [dbo].[__EFMigrationsHistory]");
/*
OTHER COMMENTED OUT CODE
*/
}
public override void Down()
{
}
}
- Бегать
Update-Database
. Он применит миграцию и удалит существующие записи отслеживания миграции (фактически не изменяя схему базы данных) и создаст строку моментального снимка в - Отправьте этот код и примените к своей базе данных разработки, промежуточной и производственной базе данных, как обычно (убедитесь, что код все еще закомментирован в функции Up, никакие изменения не будут применены, за исключением новой записи, созданной в
__EFMigrationsHistory
) - Удалять
migrationBuilder.Sql("DELETE FROM [dbo].[__EFMigrationsHistory]");
и раскомментируйте весь код из шага 5 и отправьте обратно в систему управления версиями. (Таким образом, новые разработчики могут создать базу данных с нуля. Если кто-то забыл обновить свою существующую базу данных, она выдаст ошибку и пожалуется, что таблицы уже существуют, поэтому они могут просто закомментировать исходный файл и применить.)
УдалитьMigrations
Папка, Clean
тогда Rebuild
проэкт. Это сработало для меня. Перед очисткой и восстановлением он говорил, что миграция уже существует, поскольку в ее кэшированной памяти она еще не удалена.
В EntityFramework 6, пожалуйста, попробуйте:
Add-Migration Initial
для того, чтобы обновить исходный файл миграции.
Этот метод не требует удаления __MigrationHistory
таблица, так что вам не нужно прикладывать руки к базе данных при развертывании.
- Удалите существующие миграции из папки "Миграции".
- В консоли диспетчера пакетов запустите
Add-Migration ResetMigrations
- Чистая история миграции в
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()
{
}
}
Моя проблема оказалась в том, что я вручную удалил папку Migrations. Я сделал это, потому что хотел сделать резервную копию содержимого, поэтому я просто перетащил папку из проекта. Позже я решил проблему, вернув ее обратно (после создания резервной копии), затем удалив папку "Миграции", щелкнув ее правой кнопкой мыши в обозревателе решений и выбрав "Удалить" во всплывающем меню.
Если вы знаете, что ваша БД и код синхронизированы, и теперь просто зависли на чем-то простом, например, на миграциях, пытающихся дублировать задачи, самый простой способ начать миграцию без потери данных — это:
- Удалите папку «Миграции» в VS.
- Создайте новую миграцию (например,
add-migration InitialCreate
) - Удалить все, кроме первой строки из
__EFMigrationsHistory
db и измените значение первой строки на ваше первое имя миграции с кодом даты (например,20220510060015_InitialCreate
)
Если вы не знаете
ProductVersion
для таблицы миграции вы можете найти ее в
Designer
или же
Snaphot
.cs
файлы во вновь созданной папке Migrations.
Теперь, когда вы запустите , он должен завершиться без ошибок (и не выполнять никаких задач). Это также может быть хорошим способом получить наиболее чистый сценарий миграции SQL для начальной производственной среды, если вы выполняли кучу переименований, удаления таблиц, столбцов и т. д. в своих ранних миграциях.
Если ваш код и база данных не синхронизированы, в зависимости от того, с каким объемом данных вы имеете дело и насколько они не синхронизированы, вероятно, лучше всего выполнить шаги 1 и 2 выше, затем сделать резервную копию базы данных и удалить ее, а также позволить миграции воссоздать это все опять с нуля, потом восстановить данные.
Microsoft: Управление миграциями — сброс всех миграций
Чтобы избежать описанных выше шагов, иногда, если миграция прерывается на полпути, вам нужно выполнить миграцию и закомментировать каждый уже завершенный блок migrationBuilder (в том порядке, в котором они были созданы), особенно если это не ясно из ошибки миграции. Таким образом, вы можете посмотреть на свою базу данных и увидеть, что таблицы, столбцы, FK, индексы и т. д., которые были удалены, переименованы, созданы и т. д., а затем просто перейдите по списку блоков migrationBuilder и выполните миграцию (закомментируйте выполненные шаги, снова запустите update-database, повторите). Когда вы закончите, раскомментируйте все.
Еще одна распространенная ошибка, с которой вы можете столкнуться, если в таблице уже есть данные, и вы пытаетесь добавить ограничение FK:
Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает (
Database1
.#sql-alter-d9b-445b
, ОГРАНИЧЕНИЕFK_TableA_TableB_TableBId
ИНОСТРАННЫЙ КЛЮЧ (TableBId
) ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРАTableB
(`ТаблБид)
Таблица, для которой вы пытаетесь создать ограничение FK, ее столбец ограничения FK не соответствует ничему в столбце PK основной таблицы. Лучше подготовиться к этому заранее, сначала создав таблицу PK с заполнителем значения по умолчанию, но если вы уже получили сообщение об ошибке, то мы здесь. Самый простой способ исправить это, чтобы избежать некоторых из более радикальных шагов, описанных выше, — это:
- Проверьте, был ли создан столбец FK и присвоено ли ему значение по умолчанию (например, в таблице A ограничение FK TableBId = "0").
- Измените таблицу PK (или сначала создайте ее) с записью идентификатора PK по умолчанию с тем значением, которое было присвоено на шаге 1 (например, в таблице B создайте запись с TableBId = "0").
- Закомментируйте все перед
migrationBuilder.AddForeignKey
заблокировать ошибку и запуститьupdate-database
опять таки. Миграция должна создать ограничение FK сейчас и завершиться. - Раскомментируйте все.
ОБНОВЛЕНИЕ 2020
Add-Migration Initial -Context ApplicationDbContext
ApplicationDbContext => Ваш контекст.
В EF6
- Удалите все ваши файлы в папке "migrations"... Но не в "Initial create" или "config".
- Удалить базу данных.
- Теперь беги
Add-Migration Initial
, - Теперь вы можете "обновить базу данных" и все будет хорошо.
В Net Core 3.0:
Мне не удалось найти способ сбросить миграцию.
У меня также возникли проблемы с неработающими миграциями, и приведенные здесь ответы не помогли мне. У меня есть веб-API.Net Core 3.0, и где-то в прошлом месяце я напрямую редактировал базу данных. Да, я сделал плохой, плохой поступок.
Предлагаемые здесь стратегии привели к ряду ошибок в консоли диспетчера пакетов:
- Перенос этого имени уже существует
- Не удалось найти снимок
- 'Force' не распознанный параметр
Конечно, я мог пропустить шаг или пропустить очистку нужных файлов, но я обнаружил, что есть способы очистить это без такой грубой силы:
- Remove-Migration из PMC для каждой миграции по имени, в обратном порядке создания, до прерванной миграции включительно
- Add-Migration для создания новой миграции, которая будет разницей между последней удачной миграцией до текущей схемы.
Теперь, когда веб-API запускается с пустой базой данных, он правильно создает все таблицы и свойства, соответствующие моделям сущностей.
HTH!
VSC(код Visual Studio) - .Net Core
1. Удалите состояние: Удалите папку миграции в вашем проекте;
2. Удалите записи __MigrationHistory в вашей базе данных;
3.
dotnet ef database drop -v
то Вы уверены, что хотите удалить базу данных «<your-database» на сервере «.»? (да / нет) Напишите "Н"
4. dotnet ef migrations добавьте Initial, затем код
20211014110429_initial
class Запись в __MigrationHistory's
Не волнуйтесь, вы не потеряете свои данные. Подписывайтесь на меня
Сделайте резервную копию вашей базы данных в целях безопасности.
Удалите папку «Миграции».
Затем перейдите на SQL-сервер и запустите эту команду в своей базе данных.
Delete FROM [dbo].[__EFMigrationsHistory]
Затем снова вернитесь в проект Visual Studio. и выполните приведенную ниже команду в консоли диспетчера пакетов.
PM> Add-migration Initial
Здесь перед вами будет создана миграция, удалите отсюда код Up и Down, например: ниже
public partial class Initial : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
//remove all code
}
protected override void Down(MigrationBuilder migrationBuilder)
{
//remove all code
}
}
В последнюю очередь вы можете запустить приведенную ниже команду в консоли диспетчера пакетов.
PM> update-database