Cách xóa và tạo lại từ đầu cơ sở dữ liệu EF Code First hiện có


84

Tôi đang sử dụng EF Code First với EF 5 trong VS 2012. Tôi sử dụng update-databaselệnh PM và tôi có một phương pháp hạt giống đơn giản để điền vào một số bảng với dữ liệu mẫu.

Tôi muốn xóa và tạo lại x.mdb của mình. Lịch sử cập nhật dường như không đồng bộ. Nếu tôi nhận xét tất cả các DBSet của tôi trong ngữ cảnh của tôi, sẽ update-databasechạy không có lỗi nhưng để lại một số bảng trong DB. Vì tôi không có dữ liệu có giá trị nào trong DB nên việc thiết lập lại mọi thứ dường như là đơn giản nhất.

Làm thế nào tôi có thể thực hiện điều này?

Câu trả lời:


110

Nếu tôi hiểu đúng ...

Nếu bạn muốn start clean:

1) Xóa DB của bạn theo cách thủ công - dù nó ở đâu (tôi cho rằng bạn đã sắp xếp kết nối của mình) hoặc làm trống nó, nhưng dễ dàng hơn / an toàn hơn là xóa tất cả cùng nhau - vì có system __MigrationHistorybảng - bạn cũng cần xóa nó.

2) Xóa tất cảmigration files - những thứ nằm dưới Migrations- và được đặt tên như số, v.v. - xóa tất cả,

3) Xây dựng lại dự án của bạn có chứa các phần di chuyển (và phần còn lại) - và đảm bảo dự án của bạn được thiết lập (cấu hình) để xây dựng tự động (điều đó đôi khi có thể gây ra sự cố - nhưng không có khả năng xảy ra với bạn),

4) Chạy Add-Migration Initiallại - sau đóUpdate-Database


5
vì vậy không có lệnh để có được di chuyển ef để xóa chính cơ sở dữ liệu?
cjb110

1
... theo như tôi biết (không chắc về các phiên bản mới nhất) - EF / migrations có khả năng 'tạo' khi không có Db và sau đó 'cập nhật' khi bạn thay đổi mã. Nhưng khi bạn cần làm một số bảo trì quản trị, bạn phải có được bàn tay dơ bẩn của bạn
NSGaga-chủ yếu là-không hoạt động

1
Tôi cũng phải xóa cơ sở dữ liệu khỏi trình khám phá đối tượng máy chủ SQL.
Steven Jeuris

Tôi phải khởi động lại visual studio trước khi chạy Update-Database để nó hoạt động. Trong lần thử đầu tiên, một lỗi đã xảy ra trong quá trình tạo cấu trúc mới mặc dù quá trình bổ sung đã diễn ra mà không có bất kỳ sự cố nào được báo cáo.
Patric

2
@lpacheco Nếu bạn có một cơ sở dữ liệu sản xuất chứa dữ liệu mà bạn không muốn phá hủy thì, uh, tôi trân trọng đề xuất rằng một câu hỏi có tên "Làm thế nào để xóa ... một cơ sở dữ liệu ... hiện có" không phải là câu hỏi hoàn toàn phù hợp với bạn .
Mark Amery

60

Nếu bạn đã thực hiện đúng cách để tạo di chuyển của mình bằng cách sử dụng lệnh Add-Migration "Name_Of_Migration"thì bạn có thể làm như sau để có một khởi đầu sạch sẽ (tất nhiên là đặt lại, nếu mất dữ liệu ):

  1. Update-database -TargetMigration:0

    Thông thường DB của bạn hiện đang trống vì các phương thức down được thực thi.

  2. Update-database

    Điều này sẽ tạo lại DB của bạn cho lần di chuyển hiện tại của bạn


1
Cập nhật-cơ sở dữ liệu -TargetMigration: 0 cần cờ -f (force) để xóa mọi thứ, nếu không nó sẽ báo có thể mất dữ liệu. Lệnh nên: Cập nhật cơ sở dữ liệu -TargetMigration: 0 -f
Tascalator

@Tascalator, tôi vừa thử điều này mà không có -f và không có cảnh báo về khả năng mất dữ liệu. Sử dụng EF 6.1.2 và có dữ liệu trong các bảng đã bị loại bỏ.
jk7

Câu trả lời hoàn hảo. Nhanh chóng và dễ dàng! Thnx
sapatelbaps

Theo EF Core Docs, tên thông số chính xác là -Target (cho EF Core 1.1) hoặc -Migration (cho EF Core 2.0)
Harvey Darvey

32

Single Liner để thả, tạo và hạt giống từ Bảng điều khiển trình quản lý gói:

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

Kaboom.


5
tại sao nó lại được yêu cầu thực hiện cùng một bước hai lần? "update-database -force" Ý tôi là
SwissCoder

Chỉ cần một thông báo nhỏ: "AutomaticMigrationDataLossAllowed = true;" là bắt buộc trong Di chuyển.
Unicco

2
Cú pháp tương đương trong EF Core chỉ là Update-Database 0. Mặc dù vậy, điều này không phù hợp với trường hợp của OP trong đó "Lịch sử cập nhật dường như không đồng bộ" ; phương pháp này hoạt động bằng cách chạy quá trình di chuyển "Xuống" cho mỗi lần di chuyển được áp dụng cho cơ sở dữ liệu, vì vậy nếu bạn đã xóa một lần di chuyển đã được áp dụng trước đó thì quá trình này sẽ không thành công (và tương tự có thể thất bại nếu bạn đã sửa đổi một lần di chuyển sau áp dụng nó). Các câu trả lời được chấp nhận là mạnh mẽ hơn. -1 cho điều đó, và sự lặp lại không giải thích được của update-database -force.
Mark Amery

1
@SwissCoder - bạn không cần cùng một bước hai lần (ít nhất, tôi đã không làm như vậy). Tôi nghĩ đó là một lỗi đánh máy.
Ed Graham

1
@SwissCoder Thành thật mà nói, tôi không nhận thấy, không có ý định xúc phạm
Vima91

31

Đối với EntityFrameworkCore, bạn có thể sử dụng như sau:

Update-Database -Migration 0

Thao tác này sẽ xóa tất cả di chuyển khỏi cơ sở dữ liệu. Sau đó, bạn có thể sử dụng:

Remove-Migration

Để xóa di chuyển của bạn. Cuối cùng, bạn có thể tạo lại di chuyển của mình và áp dụng nó vào cơ sở dữ liệu.

Add-Migration Initialize
Update-Database

Đã thử nghiệm trên EFCore v2.1.0


2
Hoạt động như một sự quyến rũ!
pavelnieks

4

Làm thế nào về ..

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

Tôi chọn điều này từ Khung thực thể lập trình: Code First , Pg 28 First Edition.


11
Đây không phải là một ida tốt. Rất có thể rằng mã này có thể đạt được sản xuất và bạn sẽ kết thúc phải khá đau đầu với khách hàng của bạn ...
Amadeo Gallardo

Điều này chỉ giảm cơ sở dữ liệu nếu mô hình thay đổi, OP muốn loại bỏ nó ngay cả khi không có thay đổi mô hình.
Quantic


0

Thực hiện các bước sau:

  1. Xóa những đối tượng sẽ được xóa khỏi ngữ cảnh // Dbset<Item> Items{get;set;} và trong Nuget Console chạy các lệnh này
  2. bổ sung di chuyển [contextName]
  3. update-database -verbose

Nó sẽ thả (các) bảng không tồn tại trong Ngữ cảnh, nhưng đã được tạo trong cơ sở dữ liệu


0

dbctx.Database.EnsureDeleted (); dbctx.Database.EnsureCreate ();


0

Hãy để tôi giúp cập nhật câu trả lời ở đây vì những người dùng mới sẽ thấy nó hữu ích. Tôi tin rằng mục đích là xóa chính cơ sở dữ liệu và tạo lại nó bằng cách sử dụng phương pháp EF Code First. 1.Mở dự án của bạn trong Visual Studio bằng cách sử dụng phần mở rộng ".sln". 2. chọn Server Explorer (nó thường ở bên trái) 3. chọn SQL Server Object Explorer. 4.Cơ sở dữ liệu bạn muốn xóa sẽ được liệt kê dưới bất kỳ localDB nào. Nhấp chuột phải vào nó và chọn xóa.


Có vẻ như OP đang tìm kiếm một lệnh chạy trên dòng lệnh, vì họ đã đề cập rõ ràng update-database, và vì anh ấy đề cập đến seeding nên tôi cho rằng họ đang tìm kiếm một giải pháp tự động để thử nghiệm. Do đó, giải pháp giao diện người dùng của bạn có thể không phải là thứ họ đang tìm kiếm.
valkn0t

-2

Vì câu hỏi này sẽ được người dùng EF Core mới nhấp vào một ngày nào đó và tôi thấy các câu trả lời hàng đầu hơi phá hoại một cách không cần thiết, tôi sẽ chỉ cho bạn một cách để bắt đầu "mới mẻ". Hãy cẩn thận, điều này sẽ xóa tất cả dữ liệu của bạn.

  1. Xóa tất cả các bảng trên máy chủ MS SQL của bạn. Đồng thời xóa bảng __EFMigrations.
  2. Kiểu dotnet ef database update
  3. EF Core bây giờ sẽ tạo lại cơ sở dữ liệu từ 0 trở lên cho đến lần di chuyển mới nhất của bạn.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.