Как заново создать базу данных для Entity Framework?

143

Я попал в плохое состояние с моим проектом ASP.Net MVC 5, используя Code-First Entity Framework. Меня не волнует потеря данных, я просто хочу иметь возможность начать все заново, воссоздать базу данных и начать использовать миграцию Code-First.

В настоящее время я нахожусь в состоянии, когда каждая попытка обновления базы данных приводит к возникновению исключения или получению сообщения об ошибке. Также веб-сайт не может получить доступ к базе данных правильно. Как я могу стереть все миграции, воссоздать базу данных и начать с нуля, не создавая новый проект? Другими словами, я хочу сохранить свой код, но удалить базу данных.

Позже я также хочу синхронизировать базу данных развертывания (SQL Server в Azure). Опять же, я не против выбросить все данные - я просто хочу, чтобы они работали.

Пожалуйста, предоставьте любые инструкции, чтобы вернуться в чистое состояние. Очень признателен.

Тоби Шарп
источник
TBH, если вы просто хотите, DROP DATABASEто ....
Достойно7

Ответы:

209

Выполните следующие шаги:

1) Сначала зайдите в обозреватель серверов в Visual Studio, проверьте, подключены ли «.mdf» соединения данных для этого проекта, если так, щелкните правой кнопкой мыши и удалите.

2) Перейдите в Solution Explorer, щелкните значок Показать все файлы.

3) Перейдите в App_Data, щелкните правой кнопкой мыши и удалите все файлы .mdf для этого проекта.

4) Удалите папку Migrations, щелкнув правой кнопкой мыши и удалив.

5) Зайдите в SQL Server Management Studio, убедитесь, что БД для этого проекта не существует, в противном случае удалите ее.

6) Перейдите в консоль диспетчера пакетов в Visual Studio и введите:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7) Запустите ваше приложение

Примечание. В шаге 6, часть 3, если появляется сообщение «Не удается прикрепить файл ...», возможно, это связано с тем, что вы полностью не удалили файлы базы данных в SQL Server.

Lin
источник
Превосходно! Это сработало, спасибо! Очень полезно на самом деле. Сходны ли шаги для повторного создания базы данных развертывания (Azure SQL)?
Тоби Шарп
привет @ TobySharp, никаких проблем. Если у вас нет данных в вашей базе данных, вы можете выполнить следующие шаги, но если у вас есть данные, шаги не совсем такие же.
Лин
У меня нет данных, которые мне нужно хранить.
Тоби Шарп
3
Обновление, если вы удалите из VS (как говорится в инструкции), а не Windows Explorer, то это работает. Кроме того, если у вас нет SQL Management Studio, вы можете использовать Sql Object Explorer в VS для удаления из локальной базы данных.
Майк Уорд
3
Если вы получаете сообщение об ошибке «Не удается прикрепить файл ...», даже если вы считаете, что удалили все, попробуйте ответить из этой темы: stackoverflow.com/questions/13275054/…
Энди
44

Я хотел бы добавить, что ответ Линя правильный.

Если вы неправильно удалили MDF, вам придется это исправить. Закрепить в проекте резьбовые соединения к МДФ. Короткий ответ; воссоздать и удалить его правильно.

  1. Создайте новый MDF и назовите его так же, как старый MDF, поместите его в ту же папку. Вы можете создать новый проект и создать новый мдф. МДФ не обязательно должен соответствовать вашим старым таблицам, потому что собирались его удалить. Поэтому создайте или скопируйте старый файл в правильную папку.
  2. Откройте его в обозревателе серверов [дважды щелкните по mdf в обозревателе решений]
  3. Удалить его в проводнике сервера
  4. Удалить его из обозревателя решений
  5. запустить update-database -force [Применить силу, если это необходимо]

Готово, наслаждайтесь вашей новой БД

ОБНОВЛЕНИЕ 11/12/14 - Я использую это все время, когда я делаю изменение дБ. Я обнаружил, что это отличный способ откатить ваши миграции на исходную базу данных:

  • Ставит БД обратно в оригинал
  • Запустите обычную миграцию, чтобы вернуть ее к текущей

    1. Update-Database -TargetMigration:0 -force [Это уничтожит все таблицы и все данные.]
    2. Update-Database -force [используйте силу при необходимости]
Стив Коулман
источник
1
Очень рад помочь ... Я собираюсь обновить свой ответ. Недавно я нашел лучший способ откатить все изменения.
Стив Коулман
8

Это сработало для меня:

  1. Удалить базу данных из обозревателя объектов SQL Server в Visual Studio. Щелкните правой кнопкой мыши и выберите «Удалить».
  2. Удалите файлы mdf и ldf из файловой системы - если они все еще там.
  3. Восстановить решение.
  4. Запустить приложение - база данных будет создана заново.
Донал
источник
1
Да, все, что мне нужно было сделать, это удалить MDF, обновить строку подключения в web.config, затем запустить приложение и зарегистрировать новую учетную запись. Он снова создал все таблицы в новой базе данных автоматически.
Дэн Бешард
3

В то время как этот вопрос основан на том, что данные не заботятся, иногда обслуживание данных имеет важное значение.

Если это так, я написал список шагов по восстановлению из кошмара Entity Framework, когда в базе данных уже есть таблицы с таким же именем: Как восстановить из кошмара Entity Framework - в базе уже есть таблицы с тем же именем

Видимо ... Модератор счел нужным удалить мой пост, поэтому я вставлю его сюда:

Как восстановить данные из кошмара Entity Framework - в базе данных уже есть таблицы с таким же именем

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

Симптом : не удается запустить Update-Database, поскольку он пытается запустить сценарий создания, а в базе данных уже есть таблицы с тем же именем.

Сообщение об ошибке: System.Data.SqlClient.SqlException (0x80131904): в базе данных уже есть объект с именем ''.

Предпосылки проблемы : EF понимает, где находится текущая база данных, по сравнению с тем, где находится код, основываясь на таблице в базе данных с именем dbo .__ MigrationHistory. Когда он смотрит на сценарии миграции, он пытается согласовать, где он был в последний раз, со сценариями. Если это невозможно, он просто пытается применить их по порядку. Это означает, что он возвращается к исходному сценарию создания, и если вы посмотрите на самую первую часть команды UP, это будет CreeateTable для таблицы, в которой произошла ошибка.

Чтобы понять это более подробно, я бы рекомендовал просмотреть оба видео, на которые есть ссылки здесь: https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

Решение : Нам нужно заставить EF думать, что текущая база данных обновлена, не применяя эти команды CreateTable. В то же время мы хотим, чтобы эти команды существовали, чтобы мы могли создавать новые локальные базы данных.

Шаг 1: Чистая производственная база данных Сначала сделайте резервную копию вашей производственной базы данных. В SSMS щелкните правой кнопкой мыши базу данных, выберите «Задачи> Экспортировать приложение уровня данных ...» и следуйте инструкциям. Откройте производственную базу данных и удалите / удалите таблицу dbo .__ MigrationHistory.

Шаг 2. Чистая локальная среда. Откройте папку с миграциями и удалите ее. Я предполагаю, что вы можете получить все это из мерзавца, если это необходимо.

Шаг 3: Воссоздать начальный. В диспетчере пакетов запустите «Enable-Migrations» (EF предложит вам использовать -ContextTypeName, если у вас несколько контекстов). Запустите «Add-Migration Initial -verbose». Это создаст начальный скрипт для создания базы данных с нуля на основе текущего кода. Если у вас были какие-либо начальные операции в предыдущем файле Configuration.cs, скопируйте их.

Шаг 4: Трюк EF. В этот момент, если мы запустим Update-Database , мы получим исходную ошибку. Итак, нам нужно обмануть EF, думая, что он актуален, без выполнения этих команд. Итак, перейдите к методу Up в начальной миграции, которую вы только что создали, и закомментируйте все это.

Шаг 5: Обновление базы данных Если в процессе Up нет кода, который нужно выполнить, EF создаст таблицу dbo .__ MigrationHistory с правильной записью, чтобы сказать, что он правильно выполнил этот скрипт. Иди и проверь, если хочешь. Теперь раскомментируйте этот код и сохраните. Вы можете снова запустить Update-Database, если хотите убедиться, что EF считает, что она обновлена. Он не выполнит шаг Up со всеми командами CreateTable, потому что думает, что это уже сделано.

Шаг 6: Подтвердите, что EF действительно актуален Если у вас был код, к которому еще не применены миграции, это то, что я сделал ...

Запустите «Add-Migration MissingMigrations». Это создаст практически пустой скрипт. Поскольку код уже был там, на самом деле были правильные команды для создания этих таблиц в начальном сценарии миграции, поэтому я просто вырезал CreateTable и эквивалентные команды удаления в методах Up и Down.

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

Шаг 7: Подтвердите и подтвердите. Сборка, тестирование, запуск. Убедитесь, что все работает, затем внесите изменения.

Шаг 8: Сообщите остальным членам вашей команды, как действовать. Когда следующий человек обновится, EF не будет знать, что произошло, поскольку сценарии, которые он выполнял раньше, не существуют. Но, если предположить, что локальные базы данных могут быть снесены и созданы заново, это все хорошо. Им нужно будет удалить свою локальную базу данных и снова создать ее из EF. Если бы у них были локальные изменения и ожидающие миграции, я бы порекомендовал им снова создать свою БД на главном компьютере, переключиться на свою функциональную ветвь и заново создать эти сценарии миграции с нуля.

System.Exception
источник
1

Просто хочу добавить к отличному ответу @Lin:

5) Б. Если у вас нет SQL Management Studio, перейдите в «Обозреватель объектов SQL Server». Если вы не видите свою базу данных проекта в локальной базе данных «Проводник объектов SQL Server», нажмите кнопку «Добавить сервер SQL», чтобы добавить ее в список вручную. Затем вы можете удалить БД из списка.

Дуди
источник
Если вы хотите добавить что-то к ответу, добавьте комментарий к этому ответу, а не публикуйте новый ответ.
Оливер
1
Я не знал об этом. Так что теперь вы можете переместить свой ответ в комментарий и удалить этот ответ, поскольку технически он не является (полным) ответом на вопрос :-)
Оливер
0

Возможно очень простое исправление, которое сработало для меня. После удаления любых ссылок на базы данных и соединений, которые вы найдете в обозревателе серверов / serverobject, щелкните правой кнопкой мыши папку App_Data (для меня не было объектов в приложении) и выберите открыть. После открытия поставить всю базу данных / и т.д. файлы в резервную папку или, если у вас есть мужество, просто удалите их. Запустите ваше приложение, и оно должно воссоздать все с нуля.

edencorbin
источник
0

Мое решение лучше всего подходит для :
- удаления вашего файла mdf
- хотите воссоздать вашу базу данных.

Чтобы воссоздать вашу базу данных, вам нужно добавить соединение с помощью Visual Studio.

Шаг 1 : Зайдите в Server Explorer, добавьте новое соединение (или найдите значок add db).

Шаг 2 : Изменение Datasource в Microsoft SQL Server Database File .

Шаг 3 : добавьте любое имя базы данных в поле Имя файла базы данных (желательно с тем же именем, которое у вас есть в атрибуте web.config AttachDbFilename ).

Шаг 4 : нажмите кнопку обзора и перейдите туда, где вы хотите, чтобы он был расположен.

Шаг 5 : в консоли диспетчера пакетов выполните командуupdate-database

Мбусо Мхизе
источник