Скиньте міграцію сутності та системи


299

Я приглушив свої міграції, використовував IgnoreChangesпочаткову міграцію, але тепер я хочу видалити всі міграції і почати з початкової міграції з усією логікою.

Коли я видаляю міграції в папці і намагаюся, і Add-Migrationвона не генерує повний файл (він порожній - тому що я не вніс жодних змін з моєї останньої, але тепер видаленої міграції).

Чи є якась команда " Відключити-міграцію" , тому я можу повторно повторитись Enable-Migrations?



3
Одне важливе зауваження, якщо у вас є кілька рядків підключення: вкажіть, яку саме використовувати під час скидання міграцій, інакше вона буде намагатися застосувати до обох, які можуть викликати проблеми, коли є розбіжності.
Jeroen Vannevel

Примітка. Якщо ви не видалили свої міграції (ви користуєтесь правильним керуванням версій?), Ви могли б оновити db - до першої міграції потім видалили пом'якшення та створили нові міграції з цієї точки. Дивіться тут: stackoverflow.com/a/23793384/309634
DarcyThomas

Відповіді:


446

Тобі потрібно :

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

    Enable-Migrations -EnableAutomaticMigrations -Force

    Використовувати з або без -EnableAutomaticMigrations

  4. І нарешті, ви можете запустити:

    Add-Migration Initial

5
^^ Зрозумів це - це помилка TFS - якщо ви використовуєте TFS, вам потрібно виконати реєстрацію перед запуском команди "Увімкнути-міграція ...". : D
BrainSlugs83

7
Якщо ви не використовуєте контроль версій, збережіть свої значення насіння перед видаленням!
RyanJMcGowan

77
@RyanJMcGowan, якщо ви не використовуєте контроль версій, ви заслуговуєте на те, щоб втратити свою роботу. :-)
Майк Коул

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

24
Для існуючої бази даних потрібно прокоментувати вміст функції "Вгору". В іншому випадку ви отримаєте помилку під час запуску "Update-Database", він скаржиться, що таблиця вже існує
Хлопець

149

Проблема: Ви перемкнули міграцію, і хочете її скинути, не видаляючи існуючих таблиць.

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

Що робити:

  1. Видаліть існуючі міграції з таблиці Migrations_History.

  2. Видаліть існуючі міграції з папки Міграції.

  3. Запустіть Скидання додавання. Це створить міграцію у вашій папці Міграція, яка включає створення таблиць (але вона не буде запущена, щоб не помилитися.)

  4. Тепер вам потрібно створити початковий рядок у таблиці MigrationHistory, щоб EF мав знімок поточного стану. EF зробить це, якщо застосувати міграцію. Однак ви не можете застосувати міграцію, яку ви тільки що зробили, оскільки таблиці вже існують у вашій базі даних. Тому переходьте до міграції та прокоментуйте весь код всередині методу "Вгору".

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

Тепер ви скинули свої міграції і, можливо, продовжуватиметесь із звичайними.


11
Це єдина відповідь, яка працювала на мене. Прийнята відповідь, схоже, не вирішує питання, що відбувається під час запуску Update-Database або запуску програми (залежно від того, який тип ініціалізатора ви використовуєте). Він спробує запустити міграцію та спробувати внести зміни, які вже існують. Якщо я щось не пропускаю.
регулярниймійк

2
Це також гнучкіша відповідь. У моєму випадку були якісь зміни, які мені потрібно було застосувати, а деякі інші - ні. Я міг би просто зберегти корисні речі в моєму Up ().
tec-goblin

1
@ H.Johnson, я на це подивився. У вас виникло питання з цього приводу?
Грег Гам

2
Потрібно пам’ятати, що з EF 6.0 таблиця _MigrationsHistory містить міграції для декількох DBContexts. Видалення його може спричинити проблеми, ви повинні видалити лише рядки, де ContextKey = ваше ім’я міграції. Також після 2 вище мені довелося знову активувати міграцію
Девід Уотерворт

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

30

Як щодо

Update-Database TargetMigration: $InitialDatabase

в консолі диспетчера пакунків? Він повинен скинути всі оновлення до його самого раннього стану.

Посилання на посилання: Перша міграція коду - перехід на конкретну версію (включаючи зменшення версії)


Я думаю, що моїм основним розладом було більше не довіряти міграціям, щоб точно підтримувати стан. І в результаті бажаючих почати з нуля.
Тодд

@Todd, я спіткнувся і не завжди було зрозуміло, чи слід видаляти файли міграції, щоб почати все спочатку. Тепер він працює наступним чином: 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 EF є деякі тонкощі (Немає початкової команди, і вам потрібно буде видалити файли "Знімок")

(Тестовано у .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

Моя проблема виявилася в тому, що я вручну видалив папку Міграції. Я це зробив, тому що хотів створити резервну копію вмісту, тому просто перетягнув папку з проекту. Пізніше я усунув проблему, вставивши її назад (після створення резервної копії), потім видаливши папку Міграції, клацнувши її правою кнопкою миші в Провіднику рішень і вибравши Видалити зі спливаючого меню.


1

У EF6

  1. Видаліть усі свої файли в папці "міграції" ... Але не "початкове створення" чи "конфігурація".
  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, і десь за останній місяць я редагував базу даних безпосередньо. Так, я зробив погану, погану справу.

Запропоновані тут стратегії призвели до низки помилок у консолі диспетчера пакунків:

  • Міграція цього імені вже існує
  • Не вдалося знайти знімок
  • "Сила" не є розпізнаваним параметром

Зрозуміло, я, можливо, пропустив крок або пропустив очищення правильних файлів, але я виявив, що є способи очистити це, не маючи великої кількості грубої сили:

  • Видалити-міграцію з PMC для кожної міграції за назвою, у зворотному порядку створення, аж до порушеної міграції
  • Додавання міграції для створення нової міграції, яка буде дельтою між останньою хорошою міграцією до поточної схеми

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

HTH!



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.