วิธีสร้างฐานข้อมูลสำหรับ Entity Framework อีกครั้งได้อย่างไร


143

ฉันเข้าสู่สถานะไม่ดีกับโครงการ ASP.Net MVC 5 ของฉันโดยใช้ Code-First Entity Framework ฉันไม่สนใจที่จะสูญเสียข้อมูลฉันแค่ต้องการเริ่มต้นใหม่สร้างฐานข้อมูลและเริ่มใช้การโยกย้ายรหัสครั้งแรก

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

หลังจากนั้นฉันจะต้องการรับฐานข้อมูลการปรับใช้ (SQL Server บน Azure) ด้วย อีกครั้งฉันไม่รังเกียจที่จะทิ้งข้อมูลทั้งหมด - ฉันแค่อยากให้มันใช้งานได้

โปรดระบุขั้นตอนวิธีการใด ๆ เพื่อกลับสู่สถานะที่สะอาด ชื่นชมมาก


TBH ถ้าคุณต้องการง่าย ๆDROP DATABASEแล้ว ....
คุ้มค่า 7

คำตอบ:


209

ทำตามขั้นตอนด้านล่าง:

1) ก่อนอื่นให้ไปที่ Server Explorer ใน Visual Studio ตรวจสอบว่าการเชื่อมต่อข้อมูล ".mdf" สำหรับโครงการนี้เชื่อมต่ออยู่หรือไม่ถ้าใช่ให้คลิกขวาและลบ

2) ไปที่ Explorer โซลูชันคลิกแสดงไอคอนไฟล์ทั้งหมด

3) ไปที่ App_Data คลิกขวาแล้วลบไฟล์ ".mdf" ทั้งหมดสำหรับโครงการนี้

4) ลบโฟลเดอร์ Migrations โดยคลิกขวาและลบ

5) ไปที่ Studio จัดการเซิร์ฟเวอร์ SQL ตรวจสอบให้แน่ใจว่าฐานข้อมูลสำหรับโครงการนี้ไม่มีอยู่หรือลบออก

6) ไปที่ Package Manager Console ใน Visual Studio และประเภท:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7) เรียกใช้แอปพลิเคชันของคุณ

หมายเหตุ: ในขั้นตอนที่ 6 ส่วนที่ 3 หากคุณได้รับข้อผิดพลาด "ไม่สามารถแนบไฟล์ ... " อาจเป็นเพราะคุณไม่ได้ลบไฟล์ฐานข้อมูลทั้งหมดใน SQL Server


ยอดเยี่ยม สิ่งนี้ได้ผลขอบคุณ! มีประโยชน์มากจริง ๆ ขั้นตอนคล้ายกันสำหรับการสร้างฐานข้อมูลการปรับใช้ใหม่ (Azure SQL) หรือไม่
Toby Sharp

สวัสดี @TobySharp ไม่มีปัญหา หากคุณไม่มีข้อมูลใด ๆ ในฐานข้อมูลของคุณคุณสามารถทำตามขั้นตอนเหล่านี้ แต่ถ้าคุณมีข้อมูลขั้นตอนจะไม่เหมือนกัน
หลิน

ฉันไม่มีข้อมูลใด ๆ ที่ฉันต้องการเก็บไว้
Toby Sharp

3
อัปเดตหากคุณลบจาก VS (ตามคำแนะนำบอก) และไม่ใช่ Windows Explorer แสดงว่าทำงานได้ นอกจากนี้หากคุณไม่มี SQL Management Studio คุณสามารถใช้ Sql Object Explorer ใน VS เพื่อลบออกจาก localdb
Mike Ward

3
หากคุณได้รับข้อผิดพลาด "ไม่สามารถแนบไฟล์ ... " แม้ว่าคุณเชื่อว่าคุณได้ลบทุกสิ่งแล้วลองตอบคำถามจากกระทู้นี้: stackoverflow.com/questions/13275054/…
Andy

44

ฉันต้องการเพิ่มว่าคำตอบของหลินนั้นถูกต้อง

หากคุณลบ MDF ไม่ถูกต้องคุณจะต้องแก้ไข เมื่อต้องการแก้ไขการเชื่อมต่อที่เมาในโครงการกับ MDF คำตอบสั้น ๆ สร้างใหม่และลบอย่างถูกต้อง

  1. สร้าง MDF ใหม่และตั้งชื่อเหมือนกับ MDF เก่าวางไว้ในตำแหน่งโฟลเดอร์เดียวกัน คุณสามารถสร้างโครงการใหม่และสร้าง mdf ใหม่ mdf ไม่จำเป็นต้องตรงกับตารางเก่าของคุณเพราะกำลังจะลบมัน ดังนั้นสร้างหรือคัดลอกไฟล์เก่าไปยังโฟลเดอร์ที่ถูกต้อง
  2. เปิดในเซิร์ฟเวอร์ explorer [ดับเบิลคลิก mdf จากโซลูชัน explorer]
  3. ลบในเซิร์ฟเวอร์ explorer
  4. ลบออกจากตัวสำรวจโซลูชัน
  5. เรียกใช้update-database -force [ใช้กำลังหากจำเป็น]

เสร็จแล้วเพลิดเพลินไปกับฐานข้อมูลใหม่ของคุณ

อัปเดต 11/12/14 - ฉันใช้สิ่งนี้ตลอดเวลาเมื่อฉันทำการเปลี่ยนแปลงฐานข้อมูล ฉันพบว่านี่เป็นวิธีที่ดีในการย้อนกลับการย้ายข้อมูลของคุณไปยังฐานข้อมูลต้นฉบับ:

  • วาง db กลับเป็นต้นฉบับ
  • เรียกใช้การโยกย้ายปกติเพื่อให้กลับเป็นปัจจุบัน

    1. Update-Database -TargetMigration:0 -force [สิ่งนี้จะทำลายตารางทั้งหมดและข้อมูลทั้งหมด]
    2. Update-Database -force [ใช้แรงถ้าจำเป็น]

1
ยินดีเป็นอย่างยิ่งที่จะช่วย ... ฉันจะอัปเดตคำตอบของฉัน ฉันเพิ่งพบวิธีที่ดีกว่าในการย้อนการเปลี่ยนแปลงทั้งหมด
Steve Coleman

8

สิ่งนี้ใช้ได้กับฉัน:

  1. ลบฐานข้อมูลจาก SQL Server Object Explorer ใน Visual Studio คลิกขวาและเลือกลบ
  2. ลบไฟล์ mdf และ ldf ออกจากระบบไฟล์ - หากยังคงมีอยู่
  3. สร้างโซลูชันใหม่
  4. Start Application - ฐานข้อมูลจะถูกสร้างขึ้นใหม่

1
ใช่สิ่งที่ฉันต้องทำคือลบ MDF อัปเดตสตริงการเชื่อมต่อใน web.config จากนั้นเรียกใช้แอปพลิเคชันและลงทะเบียนบัญชีใหม่ มันสร้างตารางทั้งหมดอีกครั้งในฐานข้อมูลใหม่โดยอัตโนมัติ
Dan Bechard

3

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

ถ้าเป็นเช่นนั้นฉันเขียนรายการของขั้นตอนเกี่ยวกับวิธีการกู้คืนจาก Entity Framework nightmare เมื่อฐานข้อมูลมีตารางที่มีชื่อเดียวกันที่นี่: วิธีการกู้คืนจาก Entity Framework nightmare - ฐานข้อมูลมีตารางที่มีชื่อเดียวกันอยู่แล้ว

เห็นได้ชัดว่า ... ผู้ดำเนินรายการเห็นว่าเหมาะสมที่จะลบโพสต์ของฉันดังนั้นฉันจะวางไว้ที่นี่:

วิธีการกู้คืนจากฝันร้ายของ Entity Framework - ฐานข้อมูลมีตารางที่มีชื่อเดียวกันอยู่แล้ว

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

อาการ : ไม่สามารถเรียกใช้ฐานข้อมูลอัปเดตได้เนื่องจากมันพยายามเรียกใช้สคริปต์การสร้างและฐานข้อมูลมีตารางที่มีชื่อเดียวกันอยู่แล้ว

ข้อความแสดงข้อผิดพลาด: System.Data.SqlClient.SqlException (0x80131904): มีวัตถุชื่อ '' อยู่ในฐานข้อมูลแล้ว

พื้นหลังของปัญหา : EF เข้าใจดีว่าฐานข้อมูลปัจจุบันอยู่ที่ไหนเมื่อเทียบกับที่รหัสอยู่บนพื้นฐานของตารางในฐานข้อมูลที่เรียกว่า dbo .__ MigrationHistory เมื่อดูที่ Migration Scripts มันจะพยายามทำการทบทวนอีกครั้งว่าสคริปต์นั้นอยู่ที่ใด หากไม่สามารถทำได้ก็แค่พยายามนำไปใช้ตามลำดับ ซึ่งหมายความว่ามันจะกลับไปที่สคริปต์การสร้างเริ่มต้นและถ้าคุณดูส่วนแรกในคำสั่ง UP มันจะเป็น CreeateTable สำหรับตารางที่มีข้อผิดพลาดเกิดขึ้น

หากต้องการทำความเข้าใจในรายละเอียดเพิ่มเติมฉันขอแนะนำให้ดูทั้งวิดีโอที่อ้างอิงที่นี่: https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

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

ขั้นตอนที่ 1: ล้างฐานข้อมูลการผลิต ก่อนอื่นทำการสำรองฐานข้อมูลการผลิตของคุณ ใน SSMS คลิกขวาที่ฐานข้อมูลเลือก "งาน> ส่งออกแอปพลิเคชันระดับข้อมูล ... " และปฏิบัติตามคำแนะนำ เปิดฐานข้อมูลการผลิตของคุณและลบ / ปล่อยตาราง dbo .__ MigrationHistory

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

ขั้นตอนที่ 3: สร้าง Initial ขึ้นใหม่ ใน Package Manager เรียกใช้ "Enable-Migrations" (EF จะแจ้งให้คุณใช้ -ContextTypeName หากคุณมีหลายบริบท) เรียกใช้ "Add-Migration Initial -verbose" สิ่งนี้จะสร้างสคริปต์เริ่มต้นเพื่อสร้างฐานข้อมูลตั้งแต่เริ่มต้นโดยยึดตามรหัสปัจจุบัน หากคุณมีการดำเนินงานของเมล็ดพันธุ์ใด ๆ ใน Configuration.cs หน้าที่แล้วให้คัดลอกสิ่งนั้นข้าม

ขั้นตอนที่ 4: เคล็ดลับ EF ณ จุดนี้ถ้าเรารันUpdate-Databaseเราจะได้รับข้อผิดพลาดเดิม ดังนั้นเราต้องหลอกให้ EF คิดว่ามันทันสมัยโดยไม่ต้องใช้คำสั่งเหล่านี้ ดังนั้นไปที่วิธีการขึ้นในการโยกย้ายเริ่มต้นที่คุณเพิ่งสร้างและแสดงความคิดเห็นทั้งหมด

ขั้นตอนที่ 5: อัปเดตฐานข้อมูล โดยไม่มีรหัสที่จะดำเนินการในกระบวนการขึ้น EF จะสร้างตาราง dbo .__ MigrationHistory พร้อมรายการที่ถูกต้องเพื่อบอกว่ามันรันสคริปต์นี้อย่างถูกต้อง ไปและตรวจสอบถ้าคุณต้องการ ตอนนี้ uncomment รหัสนั้นและบันทึก คุณสามารถเรียกใช้Update-Databaseอีกครั้งหากคุณต้องการตรวจสอบว่า EF คิดว่าเป็นข้อมูลล่าสุด มันจะไม่รันขั้นตอนขึ้นกับคำสั่ง CreateTable ทั้งหมดเพราะคิดว่ามันได้ทำไปแล้ว

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

เรียกใช้ "Add-Migration MissingMigrations" ซึ่งจะสร้างสคริปต์ว่างเปล่าในทางปฏิบัติ เนื่องจากมีรหัสอยู่แล้วจริง ๆ แล้วมีคำสั่งที่ถูกต้องในการสร้างตารางเหล่านี้ในสคริปต์การย้ายข้อมูลเริ่มต้นดังนั้นฉันจึงตัดคำสั่ง CreateTable และคำสั่งที่เทียบเท่าลงในวิธีการขึ้นและลง

ตอนนี้ให้เรียกใช้Update-Databaseอีกครั้งและดูมันรันสคริปต์การย้ายข้อมูลใหม่ของคุณสร้างตารางที่เหมาะสมในฐานข้อมูล

ขั้นตอนที่ 7: ยืนยันและยืนยันอีกครั้ง สร้างทดสอบเรียกใช้ ตรวจสอบให้แน่ใจว่าทุกอย่างทำงานแล้วส่งการเปลี่ยนแปลง

ขั้นตอนที่ 8: ให้ทีมที่เหลือของคุณรู้วิธีดำเนินการต่อ เมื่อมีการอัปเดตบุคคลต่อไป EF จะไม่ทราบว่ามีอะไรที่กระทบกันเนื่องจากสคริปต์ที่เคยใช้มาก่อนไม่มีอยู่จริง แต่สมมติว่าฐานข้อมูลท้องถิ่นสามารถปลิวไปและสร้างใหม่ได้ทั้งหมดนี้เป็นสิ่งที่ดี พวกเขาจะต้องวางฐานข้อมูลในเครื่องแล้วเพิ่มสร้างจาก EF อีกครั้ง หากพวกเขามีการเปลี่ยนแปลงในท้องถิ่นและการย้ายข้อมูลที่ค้างอยู่ฉันขอแนะนำให้สร้างฐานข้อมูลของพวกเขาอีกครั้งบนต้นแบบเปลี่ยนไปที่สาขาคุณลักษณะของพวกเขาและสร้างสคริปต์การย้ายข้อมูลเหล่านั้นอีกครั้งตั้งแต่เริ่มต้น


1

เพียงแค่ต้องการเพิ่มคำตอบที่ยอดเยี่ยมของ @Lin:

5) B. หากคุณไม่มี SQL Management Studio ให้ไปที่ "SQL Server Object Explorer" หากคุณไม่เห็น db โครงการของคุณใน localdb "SQL Server Object Explorer" จากนั้นคลิกที่ปุ่ม "เพิ่มเซิร์ฟเวอร์ SQL" เพื่อเพิ่มลงในรายการด้วยตนเอง จากนั้นคุณสามารถลบ db ออกจากรายการ


หากคุณต้องการเพิ่มคำตอบโปรดเพิ่มความคิดเห็นในคำตอบนั้นแทนที่จะโพสต์คำตอบใหม่
โอลิเวอร์

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

0

การแก้ไขที่ง่ายมากที่เป็นไปได้ที่เหมาะกับฉัน หลังจากลบการอ้างอิงฐานข้อมูลและการเชื่อมต่อใด ๆ ที่คุณพบในเซิร์ฟเวอร์ / เซิร์ฟเวอร์วัตถุ explorer คลิกขวาที่โฟลเดอร์ App_Data (ไม่แสดงวัตถุใด ๆ ภายในแอปพลิเคชันสำหรับฉัน) และเลือกเปิด เมื่อเปิดให้ใส่ทุกฐานข้อมูล / etc ไฟล์ในโฟลเดอร์สำรองหรือหากคุณมีความกล้าเพียงแค่ลบมัน เรียกใช้แอปพลิเคชันของคุณและมันควรสร้างทุกอย่างใหม่ตั้งแต่เริ่มต้น


0

โซลูชันของฉันเหมาะสมที่สุดสำหรับ :
- ลบไฟล์ mdf ของคุณ
- ต้องการสร้าง db ของคุณใหม่

ในการสร้างฐานข้อมูลของคุณใหม่คุณต้องเพิ่มการเชื่อมต่อโดยใช้ Visual Studio

ขั้นตอนที่ 1 : ไปที่ Server Explorer เพิ่มการเชื่อมต่อใหม่ (หรือมองหาไอคอนเพิ่ม db)

ขั้นตอนที่ 2 : การเปลี่ยนแปลงแหล่งข้อมูลไปยังMicrosoft SQL Server ไฟล์ฐานข้อมูล

ขั้นตอนที่ 3 : เพิ่มชื่อฐานข้อมูลใด ๆ ที่คุณต้องการในฟิลด์ชื่อไฟล์ฐานข้อมูล (ควรมีชื่อเดียวกับที่คุณมีในแอตทริบิวต์web.config AttachDbFilename )

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

ขั้นตอนที่ 5 : ในคำสั่งเรียกใช้คอนโซลผู้จัดการแพคเกจupdate-database

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