Как удалить и воссоздать с нуля существующую базу данных EF Code First


84

Я использую EF Code First с EF 5 в VS 2012. Я использую update-databaseкоманду PM и у меня есть простой метод начального числа для заполнения некоторых таблиц образцами данных.

Я хочу удалить и заново создать свой x.mdb. Похоже, что история обновлений не синхронизирована. Если я закомментирую все свои DBSet в моем контексте, update-databaseзапускается без ошибок, но оставляет некоторые таблицы в БД. Поскольку у меня нет ценных данных в БД, проще всего сбросить все настройки.

Как я могу этого добиться?

Ответы:


112

Если я правильно понимаю ...

Если вы хотите start clean:

1) Вручную удалите свою БД - где бы она ни находилась (я предполагаю, что ваше соединение отсортировано) или очистите ее, но проще / безопаснее удалить все вместе - поскольку есть system __MigrationHistoryтаблица - вам тоже нужно это удалить.

2) Удалите всеmigration files - которые находятся под Migrations- и названы как числа и т.д. - удалите их все,

3) Перестройте свой проект, содержащий миграции (и остальные) - и убедитесь, что ваш проект настроен (конфигурация) для автоматической сборки (что иногда может вызывать проблемы - но вряд ли для вас),

4) Запускаем еще Add-Migration Initialраз - потомUpdate-Database


6
так что нет команды для получения ef migrations для удаления самой базы данных?
cjb110 08

1
... насколько я знаю (не уверен в последних версиях) - EF / migrations хорошо «создают», когда нет Db, а затем «обновляют» при изменении кода. Но когда вам нужно выполнить какое-то обслуживание администратора, вам нужно запачкать руки
NSGaga-в основном-неактивен

1
Мне также пришлось удалить базу данных из проводника объектов SQL-сервера.
Стивен Джеурис

Мне пришлось перезапустить визуальную студию перед запуском Update-Database, чтобы она заработала. При первой попытке во время генерации новых структур произошла ошибка, хотя добавление-миграция прошла без каких-либо проблем.
Patric

2
@lpacheco Если у вас есть производственная база данных, содержащая данные, которые вы не хотите уничтожать, тогда я с уважением предлагаю задать вопрос под названием «Как удалить ... существующую ... базу данных» был не совсем подходящим вопросом для вас .
Марк Эмери

60

Если вы сработали правильный способ создания своих миграций с помощью команды, Add-Migration "Name_Of_Migration"вы можете сделать следующее, чтобы получить чистый старт (сброс, конечно , с потерей данных ):

  1. Update-database -TargetMigration:0

    Обычно ваша БД сейчас пуста, так как были выполнены методы down.

  2. Update-database

    Это воссоздает вашу БД для текущей миграции.


1
Update-database -TargetMigration: 0 нужен флаг -f (force), чтобы удалить все, иначе он скажет возможную потерю данных. Команда должна быть такой: Update-database -TargetMigration: 0 -f
Tascalator

@Tascalator, я просто попробовал это без -f, и не было предупреждения о возможной потере данных. Используя EF 6.1.2, и в таблицах были данные, которые были удалены.
jk7,

Прекрасный ответ. Быстро и просто! Thnx
sapatelbaps

Согласно EF Core Docs, правильное имя параметра - -Target (для EF Core 1.1) или -Migration (для EF Core 2.0)
Харви Дарви

32

Единый лайнер для удаления, создания и заполнения из консоли диспетчера пакетов:

update-database -TargetMigration:0 | update-database -force

Кабум.


5
зачем нужно выполнять один и тот же шаг дважды? "update-database -force" я имею в виду
SwissCoder

Небольшое примечание: «AutomaticMigrationDataLossAllowed = true;» требуется в Конфигурации.
Unicco

2
Эквивалентный синтаксис в EF Core просто Update-Database 0. Тем не менее, это не подходит для случая OP, когда «История обновлений, кажется, не синхронизирована» ; этот подход работает, выполняя миграцию «вниз» для каждой миграции, примененной к базе данных, поэтому, если вы удалили миграцию, которая была применена ранее, это приведет к сбою (и может также не получиться, если вы изменили миграцию после применяя это). Общепринятый ответ является более надежным. -1 за это и за необъяснимое повторение update-database -force.
Марк Эмери

1
@SwissCoder - вам не нужен один и тот же шаг дважды (по крайней мере, я не делал). Думаю, это была опечатка.
Эд Грэм

1
@SwissCoder Честно говоря, я не заметил, без обид
Vima91

32

Для EntityFrameworkCore вы можете использовать следующее:

Update-Database -Migration 0

Это удалит все миграции из базы данных. Тогда вы можете использовать:

Remove-Migration

Чтобы удалить вашу миграцию. Наконец, вы можете воссоздать миграцию и применить ее к базе данных.

Add-Migration Initialize
Update-Database

Протестировано на EFCore v2.1.0


2
Работает как шарм!
pavelnieks

Не работает на 5
user77232

@ user77232 Сожалею, что это больше не работает на .net 5. Изменили ли они команды, которые вы используете в диспетчере пакетов? Я давно не работал с EF, поэтому не уверен.
Gizmo3399

Я исправился. Это «-Migration 0». Я думал, вам нужно указать имя миграции, к которой вы хотите вернуться. Работает в 5!
user77232

4

Как насчет ..

static void Main(string[] args)
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ExampleContext>());  
    // C
    // o
    // d
    // i
    // n
    // g
}

Я взял это из Programming Entity Framework: Code First , Pg 28 First Edition.


11
Это не очень хорошая идея. Скорее всего, этот код может попасть в производственную среду, и в конечном итоге у вас будет головная боль со своими клиентами ...
Амадео Галлардо,

Это удаляет базу данных только в случае изменения модели, OP хочет удалить ее даже без изменения модели.
Quantic

1

Если вы создали свою базу данных, следуя этому руководству: https://msdn.microsoft.com/en-au/data/jj193542.aspx

... тогда это может сработать:

  1. Удалить все .mdfи .ldfфайлы в директории проекта
  2. Перейдите в View / SQL Server Object Explorer и удалите базу данных из подузла (localdb) \ v11.0. См. Также https://stackoverflow.com/a/15832184/2279059

0

Сделайте следующие шаги:

  1. Удаляем тот объект, который нужно удалить из контекста // Dbset<Item> Items{get;set;} и в консоли Nuget выполните эти команды
  2. добавление миграции [contextName]
  3. обновить базу данных -verbose

Он удалит таблицы, которые не существуют в контексте, но уже созданы в базе данных.



0

Позвольте мне помочь в обновлении ответов здесь, так как новые пользователи сочтут это полезным. Я считаю, что цель состоит в том, чтобы удалить саму базу данных и воссоздать ее с использованием подхода EF Code First. 1. Откройте свой проект в Visual Studio, используя расширение ".sln". 2. Выберите Server Explorer (часто слева) 3. Выберите SQL Server Object Explorer. 4. База данных, которую вы хотите удалить, будет указана в любом из localDB. Щелкните его правой кнопкой мыши и выберите удалить.


Кажется, что OP искал команду, запущенную в командной строке, поскольку они явно упомянули update-database, и поскольку он упоминает раздачу, я предполагаю, что они искали автоматическое решение для тестирования. Поэтому ваше UI-решение, вероятно, не то, что они ищут.
valkn0t

0

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

dotnet ef database update previousMigraionName    

Но у некоторых баз данных есть ограничения, такие как запрет на изменение после создания отношений, это означает, что вы не разрешаете привилегиям удалять столбцы от поставщиков баз данных ef, но большую часть времени в базе данных сброса ядра ef разрешено. Поэтому вы можете удалить БД с помощью команды drop, а затем вы снова используете предыдущую миграцию.

dotnet ef database drop
PMC command 
PM> drop-database

ИЛИ вы можете вручную удалить базу данных и выполнить миграцию.


-2

Поскольку однажды на этот вопрос будут нажимать новые пользователи EF Core, и я считаю, что основные ответы несколько излишне деструктивны, я покажу вам способ начать «все заново». Остерегайтесь, это удалит все ваши данные.

  1. Удалите все таблицы на вашем сервере MS SQL. Также удалите таблицу __EFMigrations.
  2. Тип dotnet ef database update
  3. EF Core теперь воссоздает базу данных с нуля до последней миграции.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.