วิธีการยกเลิกการย้ายข้อมูลใน ASP.NET Core ด้วย EF Core


180

เมื่อฉันรันPM> Remove-Migration -context BloggingContextใน VS2015 ด้วยโครงการ ASP.NET Core โดยใช้ EF Core ฉันได้รับข้อผิดพลาดดังต่อไปนี้:

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

ฉันจะยกเลิกการสมัครได้อย่างไร ฉันใช้ ASP.NET Core 1.0 รุ่นล่าสุด, EF Core และ VS2015 Update 3


3
ลองเพิ่ม-forceในตอนท้าย
สำรวจ

1
บทความlearnentityframeworkcore.com/migrations#reversing-a-migrationอธิบายขั้นตอนต่างๆ ขอบคุณ@drewskisสำหรับลิงก์
Michael Freidgeim

ขอบคุณ
@MichaelFreidgeim

คำตอบ:


215

ใช้:

CLI

> dotnet ef database update <previous-migration-name>

คอนโซลตัวจัดการแพคเกจ

PM> Update-Database <previous-migration-name>

ตัวอย่าง:

PM> Update-Database MyInitialMigration

จากนั้นลองลบการโยกย้ายครั้งล่าสุด

การลบการย้ายข้อมูลที่ไม่มีการอัปเดตฐานข้อมูลไม่ทำงานเนื่องจากคุณใช้การเปลี่ยนแปลงกับฐานข้อมูล

หากใช้ PMC ให้ลอง: PM> update-database 0 ซึ่งจะเป็นการล้างฐานข้อมูลและอนุญาตให้คุณลบ Migration Snapshot บนโซลูชันของคุณ


6
ฉันยังคงได้รับข้อผิดพลาดเดียวกัน ฉันใช้ครั้งแรกdotnet ef database update MyFirstMigration --context BloggingContextที่ทำงานได้สำเร็จ แล้วผมก็วิ่งdotnet ef migrations remove --context BloggingContextที่ให้ฉันเกิดข้อผิดพลาดเช่นเดียวกับในการโพสต์ของฉัน
น้ำ

14
MyFirstMigrationคุณจะต้องปรับปรุงในการโยกย้ายก่อน หากนั่นคือการโยกย้ายครั้งที่ 1 (ตามชื่อหมายถึง) คุณสามารถใช้dotnet ef database update 0เพื่อยกเลิกการย้ายข้อมูลทั้งหมด (ไม่ใช้) จากฐานข้อมูล dotnet ef migrations removeแล้วคุณควรจะสามารถทำงานได้
bvpb

นอกจากนี้ยังเป็นที่น่าสังเกตว่าคุณควรใช้ชื่อของการย้ายข้อมูลเท่านั้นไม่รวมคำนำหน้าวัน
โครงสร้าง

2
โทรdotnet ef migrations removeหลังจากนี้
Chamika Sandamal

คำสั่งที่สองของคุณ: "จากนั้นลองลบการย้ายข้อมูลครั้งล่าสุด" ไม่เสร็จสมบูรณ์ในคำตอบนี้โปรดพูดว่าคุณหมายถึงอะไร ลบไฟล์การโยกย้ายหรือไม่ รันคำสั่งหรือไม่? ...
S.Serpooshan

125

หากต้องการลบการย้ายข้อมูลทั้งหมดและเริ่มต้นใหม่อีกครั้งให้ทำดังต่อไปนี้:

dotnet ef database update 0
dotnet ef migrations remove

1
แต่คุณไม่ต้องการลบการโยกย้ายทั้งหมด ตัวอย่างเช่นคุณต้องการให้ VS การโยกย้ายเริ่มต้นสร้างขึ้นเพื่อระบุตัวตน (บัญชีผู้ใช้) ภายใต้โฟลเดอร์ Data \ Migrations
nam

เป็นการดีที่จะทราบdotnet ef database update 0แต่การทำงานdotnet ef migrations removeหลังจากนั้นจะเป็นการลบการโยกย้ายเริ่มต้นสำหรับข้อมูลประจำตัวซึ่งอาจไม่ต้องการ
kimbaudi

ขอบคุณสำหรับเคล็ดลับdotnet ef database update 0! ฉันไม่เห็นสิ่งนี้พูดถึงทุกที่ ...
โทเบียสเจ

3
@nam "แต่คุณไม่ต้องการลบการย้ายข้อมูลทั้งหมด" แต่พวกเราบางคนทำ อย่าคิดในสิ่งที่ฉันต้องการ :)
starmandeluxe

3
สิ่งนี้ไม่ได้ผลสำหรับฉัน บรรทัดแรกนั้นใช้ได้และลบการย้ายทั้งหมดในบรรทัดที่สองที่ฉันยังได้รับThe migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
Ido Ran

52

คุณยังสามารถใช้Update-Databaseคำสั่ง

Update-Database -Migration <migration name> -Context <context name>

อย่างไรก็ตามการตัดสินจากชื่อการย้ายข้อมูลของคุณฉันถือว่าเป็นการย้ายครั้งแรกดังนั้นคำสั่งนั้นอาจไม่ทำงาน คุณควรจะสามารถลบรายการออกจาก__MigrationHistoryตารางในฐานข้อมูลของคุณแล้วเรียกใช้Remove-Migrationคำสั่งอีกครั้ง คุณสามารถลบไฟล์การโยกย้ายและเริ่มต้นอีกครั้ง


คุณสามารถโทรUpdate-Databaseจาก Package Management Console หรือโทรdotnet ef database updateจากพรอมต์คำสั่งจากไดเรกทอรีโครงการ
kimbaudi

7
เพียงชี้แจงคำตอบของแบรดที่นี่ - <migration name>ควรเป็นชื่อของการย้ายข้อมูลที่คุณต้องการกลับไปที่ (เช่นอาจเป็นการโยกย้ายก่อนที่คุณจะเมาขึ้น) ไม่ใช่ชื่อของการโยกย้ายที่คุณต้องการเลิกทำ
Mark Amery

52

หากต้องการนำการโยกย้ายไปใช้อย่างเฉพาะเจาะจง :

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

หากต้องการยกเลิกการย้ายข้อมูลทั้งหมด :

dotnet ef database update 0
or
PM> Update-Database -Migration 0

หากต้องการลบการย้ายข้อมูลครั้งล่าสุด:

dotnet ef migrations remove
or
PM> Remove-Migration

หากต้องการลบการย้ายข้อมูลทั้งหมด:

เพียงลบMigrationsโฟลเดอร์

หากต้องการลบการย้ายข้อมูลสองสามครั้งล่าสุด (ไม่ใช่ทั้งหมด):

ไม่มีคำสั่งให้ลบการย้ายข้อมูลจำนวนมากและเราไม่สามารถลบไฟล์เหล่านี้migrationsและ*.designer.csไฟล์ออกเนื่องจากเราต้องการเก็บไฟล์ snapshot ให้อยู่ในสถานะที่สอดคล้องกัน เราจำเป็นต้องลบการย้ายข้อมูลทีละรายการ (ดูTo remove last migrationด้านบน)

หากต้องการยกเลิกใช้งานและลบการโยกย้ายครั้งล่าสุด:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force

ฉันเห็นคำunapplyเหล่านี้ทั่วโพสต์เหล่านี้ มันเพิ่งตีฉันไม่ใช่คำศัพท์ทางเทคนิคคำว่าun - apply
Helzgate

28

หากต้องการยกเลิกการย้ายข้อมูลที่ใช้ครั้งล่าสุดคุณควร (คำสั่งคอนโซลตัวจัดการแพคเกจ):

  1. ย้อนกลับการโยกย้ายจากฐานข้อมูล: PM> Update-Database <prior-migration-name>
  2. ลบไฟล์การโยกย้ายจากโครงการ (หรือจะนำมาใช้อีกครั้งในขั้นตอนถัดไป)
  3. อัปเดตภาพรวมโมเดล: PM> Remove-Migration

UPD : ดูเหมือนว่าขั้นตอนที่สองจะไม่จำเป็นต้องใช้ใน Visual Studio รุ่นล่าสุด (2017)


1
ขอบคุณ! สิ่งนี้ได้ผลอย่างสมบูรณ์แบบซึ่งทำให้หลงใหลในโซลูชันที่ไม่มีใครเคยพูดถึงความต้องการขั้นตอนที่ 2
Michael Kargl

ใช่ไม่มีใครพูดถึงขั้นตอนที่สองขอบคุณ
Ajas Aju

ไม่แน่ใจเกี่ยวกับขั้นตอนที่สองในกรณีของฉัน (ล่าสุด VS2017) ไฟล์การโยกย้ายจะถูกลบโดยอัตโนมัติหลังจากการโทรRemove-Migrationโดยไม่มีปัญหา ฉันไม่แน่ใจว่าสิ่งที่คุณพูดว่า "มันจะถูกนำมาใช้อีกครั้งในขั้นตอนต่อไป"!
S.Serpooshan

@ S. Serpooshan แน่นอน ฉันลบมันด้วยตนเอง แต่เมื่อฉันเรียกใช้ Remove-Migration มันบ่นเกี่ยวกับการโยกย้ายก่อนหน้านี้ของฉันที่ถูกนำไปใช้กับฐานข้อมูล แต่มันได้ผล
MetalMikester

ขั้นตอนที่สองฉันคิดว่าจำเป็นเฉพาะเมื่อคุณโทรหาdbContext.Database.Migrate()ใน startup.cs
user3413723

23

เพียงคุณสามารถกำหนดเป้าหมายการโยกย้ายตามค่า

 Update-Database -Migration:0

จากนั้นไปข้างหน้าและลบออก

 Remove-Migration

1
สิ่งนี้ใช้ได้สำหรับฉัน แต่ฉันใช้ EF และ. NET core 2.0 กับ VS2017
James Morrison

2
ระวัง: -Migration: 0 หมายถึงกลับไปที่สถานะโดยไม่มีการโยกย้าย นี่จะล้างฐานข้อมูลของคุณ
Kieren Johnstone

ใช่ตามคำถามที่ถาม คุณสามารถเพิ่มค่าขึ้นอยู่กับการโยกย้ายที่คุณต้องการย้อนกลับไป
John Nyingi

11

หากต้องการ "ไม่ใช้" การโยกย้าย (ล่าสุด?) หลังจากการปรับใช้กับฐานข้อมูลแล้ว:

  1. เปิดตัว SQL Server วัตถุ Explorer (ดู -> "วัตถุเซิร์ฟเวอร์ SQL Explorer")
  2. นำทางไปยังฐานข้อมูลที่เชื่อมโยงกับโครงการของคุณโดยขยายสามเหลี่ยมเล็ก ๆ ไปด้านข้าง
  3. ขยาย "ตาราง"
  4. ค้นหาตารางชื่อ "dbo._EFMigrationsHistory"
  5. คลิกขวาและเลือก "ดูข้อมูล" เพื่อดูรายการตารางใน Visual Studio
  6. ลบแถวที่สอดคล้องกับการย้ายข้อมูลของคุณที่คุณต้องการยกเลิกการใช้ (พูดว่า "ใช่" ในคำเตือนหากได้รับแจ้ง)
  7. รัน "dotnet ef migrations remove" อีกครั้งในหน้าต่างคำสั่งในไดเรกทอรีที่มีไฟล์ project.json หรือเรียกใช้คำสั่ง "ลบการโยกย้าย" ในคอนโซลตัวจัดการแพคเกจ

หวังว่านี่จะช่วยได้และใช้ได้กับการโยกย้ายใด ๆ ในโครงการ ... ฉันทดสอบสิ่งนี้กับการโยกย้ายครั้งล่าสุดเท่านั้น ...

การเข้ารหัสที่มีความสุข!


21
สิ่งนี้จะไม่ยกเลิกการใช้การโยกย้ายเพียงแค่ทำให้เฟรมเวิร์ก "คิด" ว่าไม่ได้ถูกนำไปใช้ ฐานข้อมูลของคุณจะอยู่ในสถานะไม่สอดคล้องกันถ้าคุณทำเช่นนี้
mark.monteiro

การแก้ไขข้อมูลด้วยตนเองใน __EFMigrationsHoryory เป็นคำแนะนำที่แย่มาก อย่าทำมัน ตารางดังกล่าวมีไว้เพื่อใช้งานภายใต้เครื่องมือการย้ายข้อมูลเท่านั้น หากคุณเริ่มแก้ไขข้อมูลด้วยตนเองความผิดพลาดเพียงครั้งเดียวสามารถสร้างพฤติกรรมที่ไม่คาดคิดที่บ้าคลั่งในโครงการของคุณได้ทุกชนิด เป็นความคิดที่ดีกว่ามากในการใช้หนึ่งในโซลูชันที่แนะนำอื่น ๆ
Joe Irby

เรามีสถานการณ์ที่สมาชิกในทีมจูเนียร์สับสนกับการสลับสาขาและจบลงด้วยการลบการย้ายข้อมูลด้วยตนเองจากทั้งคู่ (แม้ว่าจะยังอยู่ในตาราง __EFMigrationsHistory ตั้งแต่ถูกนำไปใช้แล้ว) เราจึงสูญเสีย "down" นี่คือสิ่งที่เราต้องทำบวกกับการกลับรายการด้วยตนเองใน SSMS ดังนั้นอย่าทำอย่างนั้น - ถ้าคุณไม่มีทางเลือกอื่นในตอนนี้ อย่างน้อยสิ่งที่เขาทำคือการเพิ่มเขตข้อมูลใหม่เดียว
เอลล่า

10

ลิงก์ที่มีประโยชน์ควรเป็นข้อคิดเห็นของคำถาม
Michael Freidgeim

นี่คือสิ่งที่คุณต้องการใช้ใน. NET core
Zac

10

คุณควรลบการบันทึก'20160703192724_MyFirstMigration' การย้ายข้อมูลจาก ตาราง'_EFMigrationsHistory'

มิฉะนั้นคำสั่งนี้จะลบการย้ายข้อมูลและลบโฟลเดอร์การย้ายข้อมูล:

   > remove-migration -force

7

โดยทั่วไปถ้าคุณใช้ Package Manager Console วิธีที่ถูกต้องในการลบการย้ายข้อมูลที่เฉพาะเจาะจงคือการอ้างอิงชื่อของการโยกย้าย

Update-Database -Migration {Name of Migration} -Context {context}

อีกวิธีหนึ่งในการลบการย้ายข้อมูลครั้งล่าสุดที่คุณใช้ตามเอกสารคือการใช้คำสั่ง:

dotnet ef migrations remove

คำสั่งนี้ควรถูกเรียกใช้งานจากพรอมต์คำสั่งผู้พัฒนา ( วิธีเปิดพรอมต์คำสั่ง ) ภายในไดเรกทอรีโซลูชันของคุณ

ตัวอย่างเช่นหากแอปพลิเคชันของคุณอยู่ในชื่อ "แอปพลิเคชัน" และอยู่ในโฟลเดอร์ c: \ Projects เส้นทางของคุณควรเป็น:

C:\Projects\Application

1
คำถามคือจะทำอย่างไรถ้า `ลบการย้าย dotnet ef ลบ 'ส่งคืนข้อผิดพลาด" การโยกย้ายถูกนำไปใช้กับฐานข้อมูลแล้ว "
Michael Freidgeim

2

ในการยกเลิกการสมัครการโยกย้ายใน EF Core 1.0 ให้ใช้คำสั่ง:

การอัพเดตฐานข้อมูล dotnet ef {migration_name}

ใช้ชื่อการย้ายข้อมูลของการย้ายข้อมูลจนกว่าคุณจะต้องการรักษาการเปลี่ยนแปลงของคุณ รายการชื่อของการโยกย้ายสามารถพบได้โดยใช้:

รายการการโยกย้าย dotnet ef


2

หากต้องการคืนค่าการย้ายข้อมูลทั้งหมดที่นำไปใช้กับ DB ให้เรียกใช้:

update-database 0

ควรตามด้วยการเรียกใช้Remove-Migrationหลายครั้งเนื่องจากมีไฟล์การโยกย้ายที่สามารถมองเห็นได้ในไดเรกทอรี คำสั่งจะลบการโอนย้ายล่าสุดและอัพเดตสแน็ปช็อต



0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();

-1

1. ค้นหาตาราง "dbo._EFMigrationsHistory" จากนั้นลบระเบียนการย้ายข้อมูลที่คุณต้องการลบ 2. เรียกใช้ "remove-migration" ใน PM (Package Manager Console) ได้ผลสำหรับฉัน


สิ่งนี้จะนำไปสู่สถานะที่ไม่สอดคล้องกันของฐานข้อมูล (เช่นคอลัมน์ถูกลบไปแล้ว)
UNeverNo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.