Di chuyển EF: Phục hồi di chuyển áp dụng cuối cùng?


434

Điều này có vẻ như là một nhiệm vụ thực sự phổ biến, nhưng tôi không thể tìm thấy một cách dễ dàng để làm điều đó.

Tôi muốn hoàn tác việc di chuyển được áp dụng cuối cùng. Tôi đã mong đợi một lệnh đơn giản, như

PM> Update-Database -TargetMigration:"-1"

Thay vào đó, tất cả những gì tôi có thể nghĩ ra là:

PM> Get-Migrations

Retrieving migrations that have been applied to the target database.
201208012131302_Add-SystemCategory
201207311827468_CategoryIdIsLong
201207232247409_AutomaticMigration
201207211340509_AutomaticMigration
201207200025294_InitialCreate

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

(Ít nhất tôi có thể chỉ sử dụng tên, bỏ qua dấu thời gian ...)

Có cách nào dễ hơn không?


1
Đáng buồn thay, ở đây chúng ta là những năm sau đó và không ai thực sự đọc câu hỏi.
Daniel ZA

Câu trả lời:


160

Kể từ EF 5.0, cách tiếp cận bạn mô tả là cách ưa thích. Vì thế

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

hoặc sử dụng di chuyển ví dụ của bạn

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

Một giải pháp sẽ là tạo một tập lệnh PS bao bọc tự động hóa các bước ở trên. Ngoài ra, vui lòng tạo một yêu cầu tính năng cho việc này, hoặc tốt hơn nữa, hãy thử thực hiện nó! https://github.com/dotnet/ef6


4
Một chi tiết khác: Nếu bạn có Di chuyển thủ công hiện có, bạn cần quay lại, nhưng nhận ra phương pháp "Xuống" của bạn không thực sự khôi phục lại mọi thứ một cách chính xác, bạn chỉ cần chỉnh sửa và lưu nó, sau đó chạy lại cơ sở dữ liệu cập nhật -target .. cho đến khi nó quay trở lại đúng cách. Sửa đổi Di chuyển thủ công sau khi thực tế - sau khi bạn đã áp dụng nó - không biến nó thành một thứ không được phép chỉnh sửa.
Chris Moschini

1
Điều này không làm việc cho tôi. Tất cả những gì tôi nhận được là "di chuyển mục tiêu được chỉ định" -1 "không tồn tại.
tutiplain

2
@tutiplain Nhìn vào khối mã thứ hai của anh ấy. Bạn trích dẫn những gì anh ấy muốn tồn tại, không phải những gì tồn tại.
Sinjai

cách chính xác để làm điều này bằng cách sử dụng lệnh dotnet là gì? Xin lỗi tôi không thể tìm thấy trong tài liệu hoặc tôi đang thiếu một cái gì đó. Đã thử qua entityframeworktutorial.net/efcore/ trên bất kỳ đề xuất nào?
Sijan Shrestha

Tôi đã tìm thấy giải pháp, dotnet ef database update LastGoodMigrationtuy nhiên, điều này có vẻ khó hiểu khi tôi đến từ nền nút và sử dụng knex, tuần tự hóa, họ có một lệnh để hoàn nguyên thay đổi cuối cùng, có lệnh nào để hoàn nguyên hành động cuối cùng được áp dụng cho cơ sở dữ liệu ?
Sijan Shrestha

415

Tôi muốn thêm một số làm rõ cho chủ đề này:

Update-Database -TargetMigration:"name_of_migration"

Những gì bạn đang làm ở trên nói rằng bạn muốn khôi phục tất cả các lần di chuyển UNTIL mà bạn còn lại với việc di chuyển được chỉ định. Do đó, nếu bạn sử dụng GET-MIGRATION và bạn thấy rằng bạn có A, B, C, D và E, thì sử dụng lệnh này sẽ khôi phục E và D để đưa bạn đến C:

Update-Database -TargetMigration:"C"

Ngoài ra, trừ khi bất kỳ ai có thể nhận xét ngược lại, tôi nhận thấy rằng bạn có thể sử dụng giá trị thứ tự và công tắc Mục tiêu ngắn (do đó, -Target giống như -TargetMigration). Nếu bạn muốn khôi phục tất cả các lần di chuyển và bắt đầu lại, bạn có thể sử dụng:

Update-Database -Target:0

0, ở trên, sẽ khôi phục ngay cả di chuyển FIRST ( đây là lệnh phá hoại - hãy chắc chắn bạn biết bạn đang làm gì trước khi sử dụng nó! ) - điều bạn không thể làm nếu bạn sử dụng cú pháp ở trên yêu cầu tên của di chuyển đích (tên của di chuyển thứ 0 không tồn tại trước khi di chuyển được áp dụng!). Vì vậy, trong trường hợp đó, bạn phải sử dụng giá trị 0 (thứ tự). Tương tự như vậy, nếu bạn đã áp dụng các lần di chuyển A, B, C, D và E (theo thứ tự đó), thì thứ tự 1 nên tham khảo A, thứ 2 nên tham khảo B, v.v. Vì vậy, để quay trở lại B, bạn có thể sử dụng:

Update-Database -TargetMigration:"B"

hoặc là

Update-Database -TargetMigration:2

Chỉnh sửa tháng 10 năm 2019:

Theo câu trả lời liên quan này cho một câu hỏi tương tự, lệnh chính xác là -Targetdành cho EF Core 1.1 trong khi đó là -Migrationdành cho EF Core 2.0.


27
Tên của di chuyển với chỉ số 0 là $InitialDatabase.
MEMark

1
Cảm ơn. Có bất kỳ giá trị $ (tên) nào để chỉ các vị trí chỉ mục khác, chẳng hạn như $ RecentDatabase hoặc một cái gì đó tương tự không?
Jazimov

Tôi không biết. Tôi đã không thể tìm thấy bất kỳ bằng cách googling đơn giản. Có lẽ duyệt mã nguồn EF sẽ tiết lộ chúng?
MEMark

3
FYI, chúng tôi mới bắt đầu điều này và đang tìm cách làm điều tương tự như OP ... sử dụng ls variable:*nó trông giống như $InitialDatabasemột biến PowerShell được định nghĩa là 0, không có bất kỳ biến nào khác được định nghĩa, ngay cả trong mã nguồn EF hiện tại. Và, di chuyển không trả lại bất cứ thứ gì, nó chỉ ghi vào bảng điều khiển, vì vậy bạn không thể lặp lại các đối tượng được trả lại ...
DrewJordan

1
Đây phải là câu trả lời
WtFudgE

75

Trong EntityFrameworkCore :

Update-Database 20161012160749_AddedOrderToCourse

nơi 20161012160749_AddedOrderToCourselà một cái tên của di cư bạn muốn rollback đến.


2
GEM! Phải mất một thời gian tôi mới tìm thấy câu trả lời này (vì họ đã thay đổi nó thành .NET Core). Chắc chắn giá trị một upvote!
Khúc côn cầu

4
Bạn không cần phải bao gồm ngày / giờ. Bạn chỉ có thể đặt tên.
Richard Marskell - Drackir

1
Điều này không hoạt động đối với tôi ... nó sẽ nói "Xong" nhưng tất cả các lần di chuyển sau khi tôi chỉ định vẫn còn. Và không có mã "Xuống" nào trong bất kỳ lần di chuyển nào được thực thi.
egmfrs

người ta cũng có thể chạy trở lại một quá trình di chuyển cụ thể như sau: Cập nhật cơ sở dữ liệu -Migration: "ThêmOrderToC thảo" Đặc biệt khi sử dụng khoảng trắng trong tên di chuyển, đây là cách để thực hiện. (tức là Cập nhật-Cơ sở dữ liệu -Migration "Đã thêm thứ tự vào khóa học")
SwissCoder

13

Giải pháp là:

Update-Database TargetMigration 201609261919239_yourLastMigrationSucess

10
Điều này đã được nói trong câu hỏi, người hỏi đã biết điều này. Tôi không thấy cách này giúp, có lẽ bạn có thể làm cho nó rõ ràng hơn?
ANeves

Câu trả lời này ngắn gọn hơn. TY Max!
andreikashin

4

Nhắc nhở bổ sung:

Nếu bạn có nhiều loại cấu hình, bạn cần chỉ định [Tên cấu hình]

Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]

3

Trong EF Core, bạn có thể nhập lệnh Remove-Migrationtrong bảng điều khiển trình quản lý gói sau khi bạn đã thêm di chuyển sai.

Bảng điều khiển đề nghị bạn làm như vậy nếu việc di chuyển của bạn có thể liên quan đến việc mất dữ liệu:

Một hoạt động đã được giàn giáo có thể dẫn đến mất dữ liệu. Vui lòng xem lại việc di chuyển cho chính xác. Để hoàn tác hành động này, hãy sử dụng Xóa-Di chuyển.


3
update-database 0

Cảnh báo : Điều này sẽ quay trở lại TẤT CẢ các lần di chuyển trong EFCore! Hãy cẩn thận sử dụng :)


2

Tôi thấy rằng điều này hoạt động khi chạy trong Bảng điều khiển quản lý gói:

dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }

Bạn có thể tạo một kịch bản làm cho nó dễ dàng hơn.


1

Tôi đang sử dụng EntityFrameworkCore và tôi sử dụng câu trả lời của @MaciejLisCK. Nếu bạn có nhiều bối cảnh DB, bạn cũng sẽ cần chỉ định bối cảnh bằng cách thêm tham số ngữ cảnh, ví dụ:

Update-Database 201207211340509_MyMigration -context myDBcontext

(nơi 201207211340509_MyMigrationdi chuyển bạn muốn quay trở lại và myDBcontextlà tên của bối cảnh DB của bạn)



0

Trong trường hợp có khả năng dataloss EF không hoàn thành lệnh cập nhật cơ sở dữ liệu vì AutomaticMigrationDataLoss ALLowed = false theo mặc định và kiểm tra lại hành động trừ khi bạn chạy nó với tham số -force .

Update-Database TargetMigration:"Your migration name" -force

hoặc là

Update-Database TargetMigration:Your_Migration_Index -force
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.