การย้ายถิ่นของ EF: การย้อนกลับไปใช้การโยกย้ายครั้งสุดท้ายหรือไม่


435

นี่เป็นงานที่ธรรมดามาก แต่ฉันไม่สามารถหาวิธีง่ายๆได้

ฉันต้องการเลิกทำการโยกย้ายครั้งสุดท้ายที่ใช้ ฉันคาดว่าจะมีคำสั่งง่าย ๆ เช่น

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

สิ่งที่ฉันสามารถทำได้คือ:

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"

(อย่างน้อยฉันสามารถใช้เพียงชื่อข้ามการประทับเวลา ... )

มีวิธีที่ง่ายกว่านี้ไหม?


1
เศร้าที่นี่เราเป็นปีต่อมาและไม่มีใครอ่านคำถามจริง
Daniel ZA

คำตอบ:


160

ในฐานะของ EF 5.0 วิธีการที่คุณอธิบายเป็นวิธีที่ต้องการ ดังนั้น

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

หรือใช้การย้ายข้อมูลตัวอย่างของคุณ

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

ทางออกหนึ่งคือการสร้างสคริปต์ PS wrapper ที่ทำตามขั้นตอนข้างต้นโดยอัตโนมัติ นอกจากนี้อย่าลังเลที่จะสร้างคำขอคุณลักษณะสำหรับสิ่งนี้หรือดีกว่าลองดูการใช้งาน! https://github.com/dotnet/ef6


4
รายละเอียดอื่น: หากคุณมีการโยกย้ายด้วยตนเองที่มีอยู่คุณต้องย้อนกลับไป แต่ตระหนักว่าวิธีการ "ลง" ของคุณไม่ย้อนกลับอย่างถูกต้องคุณสามารถแก้ไขและบันทึกจากนั้นทำการอัพเดทฐานข้อมูลอีกครั้ง - เป้าหมาย .. จนกว่าจะย้อนกลับอย่างถูกต้อง การปรับเปลี่ยนการย้ายข้อมูลด้วยตนเองหลังจากข้อเท็จจริง - หลังจากที่คุณใช้ไปแล้ว - ไม่เปลี่ยนเป็นสิ่งที่ไม่ได้รับอนุญาตให้แก้ไข
Chris Moschini

1
สิ่งนี้ไม่ได้ผลสำหรับฉัน ทั้งหมดที่ฉันได้รับคือ "การโยกย้ายเป้าหมายที่ระบุ" -1 "ไม่มีอยู่จริง
tutiplain

2
@tutiplain ดูบล็อกรหัสที่สองของเขา คุณอ้างถึงสิ่งที่เขาปรารถนามีอยู่ไม่ใช่สิ่งที่มีอยู่
Sinjai

วิธีที่ถูกต้องในการทำสิ่งนี้โดยใช้คำสั่ง dotnet คืออะไร? ขออภัยฉันหาไม่พบในเอกสารประกอบหรือมีบางอย่างขาดหายไป พยายามผ่านentityframeworktutorial.net/efcore/… ข้อเสนอแนะใด ๆ ?
Sijan Shrestha

ฉันพบวิธีแก้ปัญหาdotnet ef database update LastGoodMigrationแต่ดูเหมือนว่าสับสนเมื่อฉันมาจากพื้นหลังของโหนดและใช้ knex, sequlize พวกเขามีคำสั่งให้ย้อนการเปลี่ยนแปลงล่าสุดมีคำสั่งใด ๆ ที่จะย้อนกลับการกระทำล่าสุดที่ใช้กับฐานข้อมูล ?
Sijan Shrestha

415

ฉันต้องการเพิ่มความกระจ่างบางอย่างให้กับกระทู้นี้:

Update-Database -TargetMigration:"name_of_migration"

สิ่งที่คุณกำลังทำข้างต้นคือการบอกว่าคุณต้องการย้อนกลับการโยกย้ายทั้งหมดจนกว่าคุณจะเหลือการโยกย้ายที่ระบุ ดังนั้นหากคุณใช้ GET-MIGRATIONS และคุณพบว่าคุณมี A, B, C, D และ E การใช้คำสั่งนี้จะย้อนกลับ E และ D เพื่อพาคุณไปที่ C:

Update-Database -TargetMigration:"C"

นอกจากนี้หากใครไม่สามารถแสดงความคิดเห็นในทางตรงกันข้ามฉันสังเกตเห็นว่าคุณสามารถใช้ค่าลำดับและสวิตช์ -Target สั้น (ดังนั้น -Target เป็นเช่นเดียวกับ -TargetMigration) หากคุณต้องการย้อนกลับการโยกย้ายทั้งหมดและเริ่มต้นใหม่คุณสามารถใช้:

Update-Database -Target:0

0 ข้างบนจะย้อนกลับแม้กระทั่งการโยกย้ายครั้งแรก ( นี่คือคำสั่งทำลาย - ให้แน่ใจว่าคุณรู้ว่าคุณกำลังทำอะไรก่อนใช้! ) - สิ่งที่คุณไม่สามารถทำได้ถ้าคุณใช้ไวยากรณ์ข้างต้นที่ต้องการชื่อ การโยกย้ายเป้าหมาย (ชื่อของการโยกย้าย 0 ไม่มีอยู่ก่อนการโยกย้ายถูกนำไปใช้!) ดังนั้นในกรณีนี้คุณต้องใช้ค่า 0 (ลำดับ) ในทำนองเดียวกันหากคุณใช้การย้ายข้อมูล A, B, C, D และ E (ตามลำดับ) ดังนั้นลำดับ 1 ควรอ้างถึง A ลำดับ 2 ควรอ้างถึง B และอื่น ๆ ดังนั้นในการย้อนกลับไปที่ B คุณสามารถใช้:

Update-Database -TargetMigration:"B"

หรือ

Update-Database -TargetMigration:2

แก้ไขตุลาคม 2019:

ตามคำตอบที่เกี่ยวข้องกับคำถาม ที่คล้ายกันคำสั่งที่ถูกต้อง-Targetสำหรับ EF Core 1.1 ในขณะที่มัน-Migrationสำหรับ EF Core 2.0


27
ชื่อของการย้ายถิ่นที่มีค่าดัชนี 0 $InitialDatabaseคือ
MEMark

1
ขอบคุณ มีค่า $ (ชื่อ) เพื่ออ้างถึงตำแหน่งดัชนีอื่น ๆ เช่น $ LatestDatabase หรืออะไรแบบนั้น?
Jazimov

ฉันไม่รู้ ฉันไม่สามารถค้นพบสิ่งใดได้โดยใช้ Google อย่างง่าย บางทีการสืบค้นซอร์สโค้ดของ EF อาจทำให้พวกเขาเปิดเผย?
MEMark

3
FYI เราเพิ่งพบเจอสิ่งนี้และกำลังมองหาที่จะทำสิ่งเดียวกันกับ OP ... การใช้ls variable:*มันดูเหมือนว่า$InitialDatabaseเป็นเพียงตัวแปร PowerShell ที่กำหนดเป็น 0 แต่ไม่มีการกำหนดอื่นใดแม้แต่ในซอร์สโค้ดของ EF ปัจจุบัน และ get-migrations ไม่ส่งคืนสิ่งใดมันเขียนไปยังคอนโซลเท่านั้นดังนั้นคุณจึงไม่สามารถย้ำข้ามวัตถุที่ส่งคืน ...
DrewJordan

1
นี่ควรเป็นคำตอบ
WtFudgE

76

ในEntityFrameworkCore :

Update-Database 20161012160749_AddedOrderToCourse

โดยที่20161012160749_AddedOrderToCourseชื่อการย้ายข้อมูลที่คุณต้องการย้อนกลับ


3
อัญมณี! ฉันใช้เวลาสักครู่เพื่อค้นหาคำตอบนี้ (เนื่องจากพวกเขาเปลี่ยนเป็น. NET Core) คุ้มค่า upvote แน่นอน!
HockeyJ

4
คุณไม่จำเป็นต้องใส่วันที่ / เวลา คุณสามารถใส่ชื่อ
Richard Marskell - Drackir

1
สิ่งนี้ไม่ได้ผลสำหรับฉัน ... มันจะพูดว่า "เสร็จสิ้น" แต่การย้ายข้อมูลทั้งหมดหลังจากที่ฉันระบุยังคงอยู่ และไม่มีรหัส "ลง" ในการย้ายข้อมูลใด ๆ ที่ได้รับการดำเนินการ
egmfrs

คุณสามารถเรียกใช้การโยกย้ายเฉพาะเช่นนั้นได้: Update-Database - Migration: "AddedOrderToCourse" โดยเฉพาะอย่างยิ่งเมื่อใช้ช่องว่างในชื่อการย้ายข้อมูลนี่เป็นวิธีที่จะทำ (เช่นอัปเดตฐานข้อมูล - ตรวจสอบ "เพิ่มคำสั่งไปยังหลักสูตร")
SwissCoder

13

ทางออกคือ:

Update-Database TargetMigration 201609261919239_yourLastMigrationSucess

10
สิ่งนี้ได้ถูกกล่าวไปแล้วในคำถามผู้ถามรู้สิ่งนี้แล้ว ฉันไม่เห็นว่ามันจะช่วยได้อย่างไรคุณอาจทำให้ชัดเจนขึ้น?
59

คำตอบนี้สั้นกระชับกว่า TY Max!
andreikashin

4

การแจ้งเตือนเพิ่มเติม:

หากคุณมีหลายประเภทการกำหนดค่าคุณต้องระบุ [ConfigurationName]

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

3

ใน EF Core คุณสามารถป้อนคำสั่งRemove-Migrationในคอนโซลตัวจัดการแพคเกจหลังจากที่คุณเพิ่มการย้ายที่ผิดพลาด

คอนโซลแนะนำให้คุณทำเช่นนั้นหากการโยกย้ายของคุณอาจเกี่ยวข้องกับการสูญเสียข้อมูล:

การดำเนินการได้รับการสนับสนุนซึ่งอาจส่งผลให้ข้อมูลสูญหาย โปรดตรวจสอบการโยกย้ายเพื่อความถูกต้อง หากต้องการยกเลิกการกระทำนี้ให้ใช้ Remove-Migration


3
update-database 0

คำเตือน : สิ่งนี้จะย้อนกลับการย้ายข้อมูลทั้งหมดใน EFCore! โปรดใช้ด้วยความระมัดระวัง :)


2

ฉันพบว่ามันใช้งานได้เมื่อทำงานใน Package Manager Console:

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

คุณสามารถสร้างสคริปต์ที่ทำให้ง่ายขึ้น


1

ฉันใช้EntityFrameworkCoreและฉันใช้คำตอบโดย @MaciejLisCK หากคุณมีบริบทฐานข้อมูลหลายรายการคุณจะต้องระบุบริบทด้วยการเพิ่มพารามิเตอร์บริบทเช่น:

Update-Database 201207211340509_MyMigration -context myDBcontext

( 201207211340509_MyMigrationการย้ายข้อมูลที่คุณต้องการย้อนกลับและmyDBcontextเป็นชื่อของบริบท DB ของคุณ)



0

ในกรณีที่มีความเป็นไปได้สำหรับ dataloss EF ไม่สมบูรณ์คำสั่ง update-database เนื่องจาก AutomaticMigrationDataLossAllowed = false โดยค่าเริ่มต้นและ roolbacks การกระทำเว้นแต่ว่าคุณจะเรียกใช้ด้วยพารามิเตอร์-force

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

หรือ

Update-Database TargetMigration:Your_Migration_Index -force
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.