Як видалити та відтворити з нуля існуючу базу даних EF Code First


84

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

Я хотів би видалити та відтворити x.mdb. Здається, історія оновлень не синхронізована. Якщо я коментую всі свої DBSets у своєму контексті, update-databaseзапускається без помилок, але залишає деякі таблиці в БД. Оскільки в БД у мене немає цінних даних, здається найпростішим скинути все.

Як я можу це зробити?

Відповіді:


110

Якщо я правильно розумію ...

Якщо ви хочете start clean:

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

2) Видалити всіmigration files - що знаходяться внизу Migrations- та з іменами, як цифри тощо - видалити їх усі

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

4) Біжи Add-Migration Initialще раз - тодіUpdate-Database


6
так що немає команди для отримання ef-міграцій для видалення самої бази даних?
cjb110

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

1
Мені також довелося видалити базу даних із провідника об’єктів SQL сервера.
Стівен Джеуріс

Мені довелося перезапустити Visual Studio перед запуском Update-Database, щоб вона запрацювала. З першої спроби під час генерації нових структур сталася помилка, хоча міграція додатків пройшла без жодних повідомлень про проблеми.
Патрік

2
@lpacheco Якщо у вас є робоча база даних, що містить дані, які ви не хочете знищувати, тоді, е-е, я з повагою припускаю, що питання під назвою "Як видалити ... існуючу ... базу даних" було для вас не зовсім правильним питанням .
Mark Amery

60

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

  1. Update-database -TargetMigration:0

    Зазвичай ваша база даних порожня, оскільки виконувались методи зниження.

  2. Update-database

    Це відновить вашу БД до поточної міграції


1
Update-database -TargetMigration: 0 потрібен прапорець -f (сила), щоб видалити все, інакше він скаже про можливу втрату даних. Команда повинна бути: 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.
Mark Amery

1
@SwissCoder - вам не потрібно один і той же крок двічі (принаймні, мені це не потрібно). Я думаю, це була помилка.
Ед Грехем,

1
@SwissCoder Чесно кажучи, я не помітив, жодної образи не передбачав
Vima91

31

Для EntityFrameworkCore ви можете використовувати наступне:

Update-Database -Migration 0

Це видалить усі міграції з бази даних. Тоді ви можете використовувати:

Remove-Migration

Щоб видалити міграцію. Нарешті, ви можете відтворити свою міграцію та застосувати її до бази даних.

Add-Migration Initialize
Update-Database

Перевірено на EFCore v2.1.0


2
Працює як шарм!
pavelnieks

4

Як на рахунок ..

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

Я взяв це у програмуванні Entity Framework: Code First , Pg 28 First Edition.


11
Це не хороша іда. Швидше за все, цей код може дійти до виробництва, і в кінцевому підсумку у вас буде головний біль від ваших клієнтів ...
Amadeo Gallardo

Це скидає базу даних лише у разі зміни моделі, 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 Console запустіть ці команди
  2. add-migration [contextName]
  3. update-database -verbose

Буде видалено таблиці, які не існують у контексті, але вже створені в базі даних



0

Дозвольте мені допомогти оновити відповіді тут, оскільки нові користувачі знайдуть це корисним. Я вважаю, що метою є видалити саму базу даних і відтворити її за допомогою підходу EF Code First. 1. Відкрийте свій проект у Visual Studio за допомогою розширення ".sln". 2.Виберіть «Провідник сервера» (це часто зліва) 3. Виберіть «Провідник об’єктів SQL Server». 4. База даних, яку ви хочете видалити, буде вказана в будь-якому з localDB. Клацніть правою кнопкою миші та виберіть видалити.


Здається, OP шукав команду, запущену в командному рядку, оскільки вони прямо згадували update-database, і оскільки він згадує про засівання, я припускаю, що вони шукали автоматизоване рішення для тестування. Тому ваше рішення інтерфейсу користувача, мабуть, не те, що вони шукають.
valkn0t

0

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

dotnet ef database update previousMigraionName    

Але деякі бази даних мають такі обмеження, як забороняти модифікувати після створення взаємозв'язків, означає, що ви не маєте дозволу скидати стовпці від провайдерів бази даних ef core, але більшість часу в ef core drop database дозволяється. Тому ви можете скидати БД за допомогою команди 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.