Як відновити базу даних для Entity Framework?


143

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

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

Пізніше я також захочу синхронізувати базу даних розгортання (SQL Server на Azure). Знову ж таки, я не проти скинути всі дані - я просто хочу, щоб вони працювали.

Будь ласка, надайте будь-які вказівки щодо повернення до чистого стану. Цінується.


TBH, якщо ви просто хочете DROP DATABASEтоді ....
Достойно7

Відповіді:


209

Виконайте нижче кроки:

1) Спочатку перейдіть до «Провідника сервера» у Visual Studio, перевірте, чи підключені дані.

2) Перейдіть до Провідника рішень, натисніть значок Показати всі файли.

3) Перейдіть до App_Data, клацніть правою кнопкою миші та видаліть усі файли ".mdf" для цього проекту.

4) Видалити папку "Міграції", клацнувши правою кнопкою миші та видалити.

5) Перейдіть до студії управління SQL Server, переконайтесь, що БД для цього проекту немає, інакше видаліть його.

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

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

7) Запустіть свою програму

Примітка. На етапі 6, частина 3, якщо ви отримаєте помилку "Не вдається приєднати файл ...", можливо, тому що ви повністю не видалили файли бази даних на SQL Server.


Відмінно! Це спрацювало, дякую! Насправді дуже корисно. Чи схожі кроки для відновлення бази розгортання (Azure SQL)?
Toby Sharp

привіт @TobySharp, жодних проблем. Якщо у вашій базі даних немає даних, ви можете виконувати ці кроки, але якщо у вас є дані, кроки не зовсім однакові.
Лін

У мене немає даних, які мені потрібно зберігати.
Toby Sharp

3
Оновлення, якщо ви видалите з VS (як вказують інструкції), а не Windows Explorer, це працює. Крім того, якщо у вас немає студії управління SQL, ви можете скористатися Sql Object Explorer у VS для видалення з localdb.
Майк Ворд,

3
Якщо ви отримуєте помилку "Не вдається приєднати файл ...", хоча ви вважаєте, що ви все видалили, спробуйте відповісти з цієї теми: stackoverflow.com/questions/13275054/…
Енді

44

Я хотів би додати, що відповідь Ліни правильна.

Якщо ви неправильно видалите MDF, вам доведеться його виправити. Для закріплення гвинтових з'єднань у проекті до МДФ. Коротка відповідь; відтворити та видалити його належним чином.

  1. Створіть новий MDF та назви його так само, як і старий MDF, покладіть його в те саме місце папки. Ви можете створити новий проект та створити новий mdf. Mdf не повинен відповідати вашим старим таблицям, тому що збирався його видалити. Тому створіть або скопіюйте стару в потрібну папку.
  2. Відкрийте його в сервері провідника [двічі клацніть mdf від розвідника рішення]
  3. Видаліть його в сервері провідника
  4. Видаліть його з Explorer Explorer
  5. запустити update-database -force [При необхідності застосувати силу]

Готово, насолоджуйтесь своїм новим db

ОНОВЛЕННЯ 12.12.14 - Я використовую це весь час, коли вношу переломні зміни на db. Я виявив, що це прекрасний спосіб повернути свої міграції до оригінального db:

  • Повертає db до оригіналу
  • Запустіть звичайну міграцію, щоб повернути її до поточного

    1. Update-Database -TargetMigration:0 -force [Це знищить усі таблиці та всі дані.]
    2. Update-Database -force [при необхідності використовувати силу]

1
Дуже рада допомогти ... Я збираюся оновити свою відповідь. Нещодавно я знайшов кращий спосіб відкатати всі зміни.
Стів Коулман

8

Це працювало для мене:

  1. Видаліть базу даних із об’єктора SQL Server Explorer у Visual Studio. Клацніть правою кнопкою миші та виберіть видалити.
  2. Видаліть файли mdf та ldf з файлової системи - якщо вони все ще є.
  3. Перебудувати рішення.
  4. Запустити додаток - база даних буде створена заново.

1
Так, все, що мені потрібно було, це видалити MDF, оновити рядок з'єднання в web.config, а потім запустити додаток і зареєструвати новий обліковий запис. Це створило всі таблиці знову в новій базі даних автоматично.
Ден Бешард

3

Хоча це запитання випливає з того, що не піклується про дані, інколи важливим є підтримка даних.

Якщо так, я написав список кроків щодо того, як відновитись з кошмару Entity Framework, коли в базі даних вже є таблиці з таким самим іменем: Як відновитись з кошмару Entity Framework - у базі даних вже є таблиці з такою ж назвою

Мабуть ... модератор вважав за потрібне видалити свою публікацію, тому я вставлю її сюди:

Як відновити кошмар від Entity Framework - у базі даних вже є таблиці з такою ж назвою

Опис : Якщо ви схожі на нас, коли ваша команда новачка в EF, ви опинитеся в стані, коли ви не можете створити нову локальну базу даних або не можете застосувати оновлення до вашої виробничої бази. Ви хочете повернутися до чистого середовища EF, а потім дотримуватися основ, але не можете. Якщо ви працюєте на виробництві, ви не можете створити локальний db, а якщо ви працюєте для локального, ваш виробничий сервер виходить із синхронізації. І нарешті, ви не хочете видаляти дані виробничого сервера.

Ознака : Неможливо запустити 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. Очищення локального середовища Відкрийте папку міграцій та видаліть її. Я припускаю, що ви можете отримати все це від git, якщо це необхідно.

Крок 3: Відтворіть початкове в диспетчері пакунків запустіть "Увімкнути-міграцію" (EF запропонує вам використовувати -ContextTypeName, якщо у вас є кілька контекстів). Виконайте "Початкова добавка-міграція -вербоза". Це створить початковий сценарій для створення бази даних з нуля на основі поточного коду. Якщо у вас були якісь операції з насінням у попередньому Configuration.cs, скопіюйте це впоперек.

Крок 4: Хитрість EF. На цьому етапі, якщо ми запустили Update-Database , ми отримаємо початкову помилку. Отже, нам потрібно обдурити EF, думаючи, що це актуально, без виконання цих команд. Отже, перейдіть до методу Up в початковій міграції, яку ви тільки що створили, і прокоментуйте все це.

Крок 5: Оновлення бази даних Без коду, який потрібно виконати в процесі оновлення , EF створить таблицю dbo .__ MigrationHistory з правильним записом, щоб сказати, що він правильно запустив цей скрипт. Зайдіть і перевірте це, якщо вам подобається. Тепер розкоптуйте цей код і збережіть. Ви можете запустити Update-Database ще раз, якщо хочете перевірити, чи вважає EF його актуальним. Він не запустить крок вгору з усіма командами CreateTable, оскільки вважає, що це вже зроблено.

Крок 6. Підтвердьте, що EF актуально актуальний Якщо у вас був код, до якого ще не було застосовано міграцій, це я зробив ...

Запустіть "Add-Migration MissingMigrations" Це створить практично порожній сценарій. Оскільки код вже був там, насправді були правильні команди для створення цих таблиць у початковому сценарії міграції, тому я просто вирізав команди CreateTable та еквівалентні команди "drop" на методи Вгору та Вниз.

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

Крок 7: Повторіть підтвердження та введіть. Будувати, тестувати, запускати Переконайтесь, що все працює, а потім введіть зміни.

Крок 8: Нехай решта вашої команди знає, як діяти. Коли наступна особа оновиться, EF не дізнається, на що потрапило, враховуючи, що сценарії, які вона виконувала раніше, не існують. Але, якщо припустити, що локальні бази даних можуть бути підірвані та відтворені, це все добре. Їм потрібно буде знову скинути свою локальну базу даних і додати її створити з EF. Якщо у них були місцеві зміни та міграції, що очікують, я рекомендую їм знову створити свій БД на головному, переключитися на свою гілку функцій та заново створити ці сценарії міграції з нуля.


1

Просто хочу додати до чудової відповіді @Lin:

5) B. Якщо у вас немає студії управління SQL, перейдіть до розділу "Провідник об'єктів SQL Server". Якщо ви не можете побачити свій проект db в localdb "Провідник об'єктів SQL Server", натисніть кнопку "Додати SQL сервер", щоб додати його до списку вручну. Потім ви можете видалити db зі списку.


Якщо ви хочете додати щось до відповіді, будь ласка, додайте коментар до цієї відповіді, а не публікуючи нову відповідь.
Олівер

1
Я цього не знав. Тож тепер ви можете перенести свою відповідь у коментар та видалити цю відповідь, оскільки технічно це не є (повною) відповіддю на питання :-)
Олівер,

0

Можливе дуже просте виправлення, яке працювало на мене. Після видалення будь-яких посилань на базу даних та підключень, які ви знайдете в сервер / serverobject Explorer, клацніть правою кнопкою миші папку App_Data (не показав жодних об'єктів у програмі для мене) та виберіть відкрити. Після відкриття покладіть всю базу даних / тощо. файли в папці резервного копіювання або якщо у вас є кишки, просто видаліть їх. Запустіть свою програму, і вона має відтворити все з нуля.


0

Моє рішення найкраще підходить для :
- видаленого файлу mdf
- хочу заново створити db.

Для відтворення вашої бази даних потрібно додати з'єднання за допомогою Visual Studio.

Крок 1 : Перейдіть до Провідника сервера, додайте нове з'єднання (або знайдіть значок додавання db).

Крок 2 : Зміна Datasource в Microsoft SQL Server Database File .

Крок 3 : додайте будь-яке ім’я бази даних, яке ви бажаєте, у поле імені файлу бази даних (бажано того самого імені, яке ви маєте в атрибуті web.config AttachDbFilename )

Крок 4 : натисніть кнопку "Оглянути" та перейдіть до місця, де вам сподобається його розташування.

Крок 5 : у команді запуску консолі менеджера пакунківupdate-database

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