ในขณะที่คำถามนี้ถูกตั้งสมมติฐานโดยไม่สนใจข้อมูล แต่บางครั้งการบำรุงรักษาข้อมูลก็เป็นสิ่งจำเป็น
ถ้าเป็นเช่นนั้นฉันเขียนรายการของขั้นตอนเกี่ยวกับวิธีการกู้คืนจาก 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 อีกครั้ง หากพวกเขามีการเปลี่ยนแปลงในท้องถิ่นและการย้ายข้อมูลที่ค้างอยู่ฉันขอแนะนำให้สร้างฐานข้อมูลของพวกเขาอีกครั้งบนต้นแบบเปลี่ยนไปที่สาขาคุณลักษณะของพวกเขาและสร้างสคริปต์การย้ายข้อมูลเหล่านั้นอีกครั้งตั้งแต่เริ่มต้น
DROP DATABASE
แล้ว ....