รีเซ็ตการโยกย้าย Entity-Framework


299

ฉันลบล้างการย้ายข้อมูลของฉันฉันใช้IgnoreChangesในการย้ายข้อมูลเริ่มต้น แต่ตอนนี้ฉันต้องการลบการย้ายข้อมูลทั้งหมดของฉันและเริ่มต้นด้วยการโยกย้ายครั้งแรกด้วยตรรกะทั้งหมด

เมื่อฉันลบการโยกย้ายในโฟลเดอร์และลองและAdd-Migrationมันไม่ได้สร้างไฟล์เต็ม (มันว่างเปล่า - เพราะฉันยังไม่ได้ทำการเปลี่ยนแปลงใด ๆ ตั้งแต่ครั้งล่าสุดของฉัน แต่ตอนนี้ถูกย้ายการย้าย)

มีคำสั่งDisable-MigrationsEnable-Migrationsหรือไม่ดังนั้นฉันจึงสามารถรันใหม่ได้?


1
ที่เกี่ยวข้อง: stackoverflow.com/questions/9703810/…
sshow

3
หมายเหตุสำคัญหนึ่งหากคุณมีหลาย connectionstrings: ระบุว่าจะใช้เมื่อคุณรีเซ็ตการโยกย้ายมิฉะนั้นมันจะพยายามที่จะใช้ทั้งสองซึ่งอาจทำให้เกิดปัญหาเมื่อมีความแตกต่าง
Jeroen Vannevel

หมายเหตุ: หากคุณไม่ได้ลบการย้ายข้อมูลของคุณ (คุณใช้การควบคุมเวอร์ชันใช่มั้ย) คุณสามารถอัปเดต db-to คุณก่อนจากนั้นจึงลบการบรรเทาและสร้างการย้ายข้อมูลใหม่จากจุดนั้น ดูที่นี่: stackoverflow.com/a/23793384/309634
DarcyThomas

คำตอบ:


446

คุณต้อง:

  1. ลบสถานะ: ลบโฟลเดอร์การย้ายข้อมูลในโครงการของคุณ และ
  2. ลบ__MigrationHistoryตารางในฐานข้อมูลของคุณ (อาจอยู่ใต้ตารางระบบ); แล้วก็
  3. รันคำสั่งต่อไปนี้ใน Package Manager Console:

    Enable-Migrations -EnableAutomaticMigrations -Force

    ใช้กับหรือไม่ใช้ -EnableAutomaticMigrations

  4. และในที่สุดคุณสามารถเรียกใช้:

    Add-Migration Initial

5
^^ คิดออก - เป็นข้อผิดพลาด TFS - ถ้าคุณใช้ TFS คุณต้องทำการเช็คอินก่อนที่จะเรียกใช้คำสั่ง "Enable-Migrations ... " : D
BrainSlugs83

7
หากคุณไม่ได้ใช้การควบคุมเวอร์ชันให้บันทึกค่า Seed ก่อนที่จะลบ!
RyanJMcGowan

77
@RyanJMcGowan หากคุณไม่ได้ใช้การควบคุมเวอร์ชันคุณควรสูญเสียงานของคุณ :-)
Mike Cole

4
@Tood +1 ถึงสิ่งนั้น ช่วยฉันได้มากเวลา ตอนนี้ถ้ามีเพียงทีม EF เท่านั้นที่สามารถรวมสิ่งเหล่านั้นลงในคำสั่งรีเซ็ตการย้ายข้อมูล อาจจะเป็น EF 6 ...
เจอรัลด์เดวิส

24
สำหรับฐานข้อมูลที่มีอยู่คุณต้องแสดงความคิดเห็นเนื้อหาของฟังก์ชั่น "ขึ้น" มิฉะนั้นคุณจะได้รับข้อผิดพลาดเมื่อคุณเรียกใช้ "อัปเดตฐานข้อมูล" ก็จะบ่นว่าตารางนั้นมีอยู่แล้ว
Guy

149

ปัญหา: คุณได้ทำการโยกย้ายข้อมูลและคุณต้องการรีเซ็ตโดยไม่ต้องลบตารางที่มีอยู่

ปัญหา: คุณไม่สามารถรีเซ็ตการย้ายข้อมูลด้วยตารางที่มีอยู่ในฐานข้อมูลเนื่องจาก EF ต้องการสร้างตารางตั้งแต่เริ่มต้น

สิ่งที่ต้องทำ:

  1. ลบการโยกย้ายที่มีอยู่จากตาราง Migrations_History

  2. ลบการโยกย้ายที่มีอยู่จากโฟลเดอร์ Migrations

  3. เรียกใช้การรีเซ็ตการโยกย้ายเพิ่ม สิ่งนี้จะสร้างการย้ายข้อมูลในโฟลเดอร์ Migration ของคุณซึ่งรวมถึงการสร้างตาราง (แต่จะไม่เรียกใช้ดังนั้นจะไม่เกิดข้อผิดพลาด)

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

  5. ตอนนี้รันฐานข้อมูล update มันจะใช้การโยกย้าย (ในขณะที่ไม่ได้เปลี่ยนฐานข้อมูลจริง) และสร้างแถวภาพรวมใน MigrationHistory

ขณะนี้คุณได้รีเซ็ตการย้ายข้อมูลของคุณและอาจดำเนินการย้ายข้อมูลต่อ


11
นี่เป็นคำตอบเดียวที่เหมาะกับฉัน คำตอบที่ได้รับการยอมรับดูเหมือนจะไม่สามารถแก้ไขปัญหาที่เกิดขึ้นเมื่อคุณเรียกใช้ Update-Database หรือเรียกใช้แอปพลิเคชันของคุณ (ขึ้นอยู่กับประเภทของ initializer ที่คุณใช้) มันจะพยายามเรียกใช้การย้ายข้อมูลและพยายามทำการเปลี่ยนแปลงที่มีอยู่แล้ว ถ้าฉันไม่มีอะไรหายไป
Regularmike

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

1
@ H.Johnson ฉันได้ดูแล้ว คุณมีคำถามเกี่ยวกับเรื่องนี้หรือไม่?
Greg Gum

2
สิ่งหนึ่งที่ต้องระวังจาก EF 6.0 ตาราง _MigrationsHistory มีการย้ายข้อมูลสำหรับ DBContexts หลายรายการ การลบมันอาจทำให้เกิดปัญหาคุณควรลบแถวที่ ContextKey = ชื่อการโยกย้ายของคุณเท่านั้น นอกจากนี้หลังจาก 2 ข้อฉันต้องเปิดใช้งานการย้ายข้อมูลอีกครั้ง
David Waterworth

2
เป็นคำตอบเดียวกันโดยมีตัวอย่างเพิ่มเติม (พร้อมภาพหน้าจอ): weblog.west-wind.com/posts/2016/Jan/13/…
nmit026

30

เกี่ยวกับ

Update-Database TargetMigration: $InitialDatabase

ใน Package Manager Console ควรรีเซ็ตการปรับปรุงทั้งหมดเป็นสถานะเริ่มต้น

ลิงค์อ้างอิง: การโยกย้ายรหัสครั้งแรก - การโยกย้ายไปยังรุ่นที่ระบุ (รวมถึงการลดระดับ)


ฉันคิดว่าความยุ่งยากหลักของฉันคือไม่เชื่อใจการย้ายถิ่นเพื่อรักษาสถานะอย่างถูกต้องอีกต่อไป และเป็นผลที่ต้องการเริ่มต้นจากศูนย์
ทอดด์

@Todd ฉันสะดุดและไม่ชัดเจนเสมอไปถ้าฉันควรลบไฟล์การโยกย้ายเพื่อเริ่มต้นใหม่ ตอนนี้มันทำงานต่อไปนี้: 1. ย้อนกลับไปเริ่มต้นโดยใช้คำสั่ง "Update-Database –TargetMigration: $ InitialDatabase" 2. ลบไฟล์การย้ายข้อมูลทั้งหมด (ตั้งชื่อโดยใช้ yyyyMMMMddHHmmssx_Name.cs หรือ. vb) 3. รีเฟรชอัปเดตโดยใช้ 'add-Migration -Name some_name' 4. ออกการอัปเดตเพื่อส่งผลต่อฐานข้อมูลของคุณโดยใช้ 'update-Database' หวังว่ามันจะเหมาะกับคุณ
Chris Voon

ในกรณีของฉันคำสั่งที่แนะนำในคำตอบนี้ส่งผลให้เกิดข้อผิดพลาด SQL
Justin Skiles

"InitialDatabase" ควรหมายถึงอะไร จะลบตารางหรือคอลัมน์ที่สร้างไว้แล้วใน DB หรือไม่
Serge

16

ในการแก้ไขปัญหานี้คุณต้อง:

  1. ลบไฟล์ * .cs ทั้งหมดในโฟลเดอร์ Migrations

  2. ลบตาราง _MigrationHistory ในฐานข้อมูล

  3. วิ่ง Enable-Migrations -EnableAutomaticMigrations -Force

  4. วิ่ง Add-Migration Reset

จากนั้นในpublic partial class Reset : DbMigrationชั้นเรียนคุณต้องแสดงความคิดเห็นตารางที่มีอยู่และปัจจุบันทั้งหมด:

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

หากคุณพลาดบิตนี้จะล้มเหลวและคุณต้องเริ่มต้นใหม่!

  1. ตอนนี้เรียกใช้ Update-Database -verbose

นี่น่าจะสำเร็จถ้าคุณทำอย่างถูกต้องและตอนนี้คุณสามารถดำเนินการได้ตามปกติ


2
แทนที่จะแสดงความคิดเห็นทุกอย่างคุณเพียงแค่เขียน "return;" ในบรรทัดแรกของวิธีการขึ้น ()
chainstair

6

เมื่อพิจารณาแล้วสิ่งนี้ยังปรากฏเมื่อเราค้นหา EF ใน. NET Core ฉันจะโพสต์คำตอบของฉันที่นี่ (เนื่องจากมันหลอกหลอนฉันมาก) โปรดทราบว่ามีรายละเอียดปลีกย่อยบางอย่างในรุ่น EF 6 .NET (ไม่มีคำสั่งเริ่มต้นและคุณจะต้องลบไฟล์ "Snapshot")

(ทดสอบใน. NET Core 2.1)

นี่คือขั้นตอน:

  1. ลบ _efmigrationhistoryตาราง
  2. ค้นหาวิธีการแก้ปัญหาทั้งหมดของคุณสำหรับไฟล์ที่มีภาพรวมอยู่ในชื่อของพวกเขาเช่นApplicationDbContextSnapshot.csและลบพวกเขา
  3. สร้างโซลูชันของคุณใหม่
  4. วิ่ง Add-Migration InitialMigration

โปรดทราบ: คุณต้องลบไฟล์ทั้งหมดในภาพรวม ฉันใช้เวลานับไม่ถ้วนเพียงแค่ลบฐานข้อมูล ... นี่จะสร้างการย้ายข้อมูลที่ว่างเปล่าหากคุณไม่ทำ

นอกจากนี้ใน # 3 คุณสามารถตั้งชื่อการย้ายข้อมูลได้ตามต้องการ

นี่คือทรัพยากรเพิ่มเติมบางส่วน: asp.net CORE Migration สร้างที่ว่างเปล่า

รีเซ็ตการย้ายข้อมูล Entity Framework 7


3

ใน EntityFramework 6 โปรดลอง:

Add-Migration Initial

เพื่ออัปเดตไฟล์การโยกย้ายเริ่มต้น


3

ใน Entity Framework Core

  1. ลบไฟล์ทั้งหมดออกจากโฟลเดอร์การย้ายข้อมูล
  2. พิมพ์ในคอนโซล

ดร็อปฐานข้อมูล dotnet ef -f -v

การโยกย้าย dotnet ef เพิ่มค่าเริ่มต้น

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


2

ปัญหาของฉันกลับกลายเป็นว่าฉันลบโฟลเดอร์ Migrations ด้วยตนเอง ฉันทำเช่นนั้นเพราะฉันต้องการสำรองเนื้อหาดังนั้นฉันก็เพียงแค่ลากโฟลเดอร์ออกจากโครงการ ฉันแก้ไขปัญหาในภายหลังโดยใส่กลับเข้าไปใน (หลังจากทำสำเนาสำรองแล้ว) ลบโฟลเดอร์ Migrations ด้วยการคลิกขวาใน Solutions Explorer และเลือกลบจากเมนูป๊อปอัพ


1

ใน EF6

  1. ลบไฟล์ทั้งหมดของคุณในโฟลเดอร์ 'migrations' ... แต่ไม่ใช่ 'สร้างครั้งแรก' หรือ 'config'
  2. ลบฐานข้อมูล
  3. Add-Migration Initialเรียกใช้ตอนนี้
  4. ตอนนี้คุณสามารถ 'อัปเดตฐานข้อมูล' และทั้งหมดจะดี

1

ลบMigrationsโฟลเดอร์Cleanแล้วRebuildโครงการ สิ่งนี้ใช้ได้สำหรับฉัน ก่อนที่จะล้างข้อมูลและสร้างใหม่มันบอกว่ามีการย้ายข้อมูลอยู่ในหน่วยความจำแคชแล้ว แต่ยังไม่ถูกลบ


0

วิธีนี้ไม่จำเป็นต้องลบ__MigrationHistoryตารางดังนั้นคุณไม่จำเป็นต้องวางฐานข้อมูลในการปรับใช้

  1. ลบการโยกย้ายที่มีอยู่จากโฟลเดอร์การโยกย้าย
  2. ใน Package Manager Console รัน Add-Migration ResetMigrations
  3. ล้างประวัติการย้ายข้อมูลในUp()เมธอด:
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}

0

ใน Net Core 3.0:

ฉันหาวิธีรีเซ็ตการโยกย้ายไม่ได้

ฉันเจอปัญหาเกี่ยวกับการย้ายที่ไม่สมบูรณ์และคำตอบที่ให้ไว้ที่นี่ไม่ได้ผลสำหรับฉัน ฉันมี. Net Core 3.0 web API และอีกแห่งหนึ่งในเดือนที่แล้วฉันแก้ไขฐานข้อมูลโดยตรง ใช่ฉันทำสิ่งที่ไม่ดีและไม่ดี

กลยุทธ์ที่แนะนำที่นี่ส่งผลให้เกิดข้อผิดพลาดจำนวนมากใน Package Manager Console:

  • มีการโยกย้ายของชื่อนั้นแล้ว
  • ไม่พบภาพรวม
  • 'Force' ไม่ใช่พารามิเตอร์ที่รู้จัก

จริงอยู่ที่ฉันอาจพลาดขั้นตอนหรือไม่ได้รับการล้างไฟล์ที่ถูกต้อง แต่ฉันพบว่ามีวิธีการล้างข้อมูลนี้โดยไม่ต้องใช้กำลังดุร้ายมาก:

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

ตอนนี้เมื่อเว็บ API เริ่มต้นด้วยฐานข้อมูลว่างเปล่ามันจะสร้างตารางและคุณสมบัติทั้งหมดอย่างถูกต้องเพื่อให้ตรงกับโมเดลเอนทิตี

HTH!



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