ฉันจะปิดใช้งานการย้ายรหัสครั้งแรกได้อย่างไร


86

ฉันมีโมเดลเอนทิตีรหัสแรกใน EF5 แต่ฉันต้องการจัดการการเปลี่ยนแปลงฐานข้อมูลด้วยตนเอง - ฉันไม่ต้องการให้ EF แก้ไขฐานข้อมูลที่มีอยู่และข้อมูลทั้งหมด แต่เมื่อฉันทำการเปลี่ยนแปลงคู่ขนานในการทำแผนที่ EF และในฐานข้อมูล EF ปฏิเสธที่จะดำเนินการอย่างถูกต้องโดยบอกว่าฉันจำเป็นต้องใช้การย้ายรหัสก่อน ฉันจะปิดสิ่งนี้ได้อย่างไร


คำตอบ:


102

ตั้งค่า Database.SetInitializer เป็น null

public class DatabaseContext: DbContext
{
    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    {
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    }

2
การตั้งค่า initializer บนตัวสร้างอินสแตนซ์ของบริบทไม่สมเหตุสมผล EF จะเรียกตัวเริ่มต้นก่อนที่จะไปยังโค้ดนั้นหากคุณพยายามสร้างบริบทใหม่
Jcl

1
เพิ่งตรวจสอบคำตอบโดยดูที่ "เครื่องมือวินิจฉัย" ใน VS 2017 ADO.NET เรียกก่อนคิวรี SQL ที่ต้องการครั้งแรกหยุดลงหลังจากตั้งค่า intializer เป็น null ในตัวสร้าง
Karl

2
มันทำงานได้ตามที่คาดไว้ EF ที่แท้จริงจะเรียก initializer มาก่อน แต่จากนั้นเรียกอีกครั้งภายในตัวสร้างทำให้ DbContext ไม่สนใจการย้ายข้อมูลในกรณีที่คุณต้องการเพิกเฉยต่อความจริงที่ว่าคุณ__MigrationHistoryไม่มีการโยกย้ายล่าสุดและคุณไม่ต้องการ ทำมันต่อไป ในกรณีของฉันฉันใช้การย้ายข้อมูลในสภาพแวดล้อม dev แต่เมื่อฉันปรับใช้กับการใช้งานจริงฉันใช้ SSDT เพื่ออัปเดตฐานข้อมูล ดังนั้น EF จะบ่นว่าโมเดลมีการเปลี่ยนแปลงเนื่องจาก__MigrationHistoryจะไม่มีการย้ายข้อมูลล่าสุด แต่ฉันสามารถรับประกันได้ว่าฐานข้อมูลจะอัปเดต
Alisson

ฉันขอแนะนำให้ย้ายการเรียกDatabase.SetInitializerจากตัวสร้างไปยังตัวสร้างคลาส เพื่อให้แน่ใจว่าจะโทรเพียงครั้งเดียว
Steven

41

ดังนั้นคำตอบที่สมบูรณ์ที่สุดที่ฉันพบคือ:

  1. ลบMigrationsโฟลเดอร์ภายในโครงการของคุณ
  2. ตั้งค่าDatabase.SetInitializer<DatabaseContext>(null);ภายในตัวเริ่มต้น DatabaseContext ของคุณ
  3. ลบตาราง__MigrationHistoryในฐานข้อมูลของคุณ สำหรับ EF6 + ตารางจะอยู่ภายใต้แต่สำหรับรุ่นก่อนหน้านี้มันจะอยู่ภายใต้TablesSystem Tables
  4. สร้างและเรียกใช้
  5. กำไร.

น่าเสียดายที่หลังจากทำตามขั้นตอนเหล่านี้แล้ว EF6 ยังคงตรวจสอบการมีอยู่ของ__MigrationHistoryทุกครั้งที่แอปพลิเคชันของฉันเริ่มทำงานซึ่งจะเพิ่มเวลาเริ่มต้นของแอปอีกไม่กี่มิลลิวินาที มีวิธีปิดการใช้งานการ__MigrationHistoryตรวจสอบทั้งหมดหรือไม่?
ได

27

หากคุณต้องการปิดการย้ายข้อมูลโดยสิ้นเชิง:

https://stackoverflow.com/a/9709407/141172

อย่างไรก็ตามฉันพบว่าดีกว่าที่จะเปิดใช้งานการโอนย้ายรหัสครั้งแรก แต่ใช้-Scriptตัวเลือกเพื่อให้ EF สร้างสคริปต์การเปลี่ยนแปลงฐานข้อมูลให้ฉันซึ่งฉันสามารถใช้กับฐานข้อมูลแต่ละรายการ (การพัฒนา, QA, การผลิต) ด้วยตนเอง:

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

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


1
การเชื่อมโยงของคุณไม่ได้จริงๆ corresponse completely turn off migrationsไป ในการทำเช่นนั้น: เพิ่มDatabase.SetInitializer<YourContextType>(null)เพื่อเริ่มต้นแอปพลิเคชันของคุณ
Don Cheadle

มีความคิดอย่างไรกับ EF Core?
Shimmy Weitzhandler

@Shimmy: EF Core ไม่ควรพยายามแก้ไขฐานข้อมูลของคุณโดยอัตโนมัติ ดูgithub.com/dotnet/efcore/issues/3152
Eric J.

26

หากคุณใช้การย้ายข้อมูลอยู่แล้วการเปลี่ยนเฉพาะ Initializer จะไม่ช่วยอะไร คุณต้องไปที่ Management Studio เปิดตารางฐานข้อมูลไปที่System Tablesโฟลเดอร์และลบ__MigrationHistoryตารางที่อยู่ในนั้น (สำหรับ EF6 ขึ้นไปจะอยู่ด้านล่างโดยตรงTables) การดำเนินการนี้จะปิดใช้งานการย้ายข้อมูลให้ดี


7
ตาราง __MigrationHistory จะอยู่ใต้ Tables ไม่ใช่ System Tables
Peter Hedberg

6
@PeterHedberg นี่เป็นเรื่องจริงสำหรับ EF6 + System Tablesสำหรับรุ่นก่อนหน้านี้มันอยู่ภายใต้การ
Episodex

1
sp_renameนอกจากนี้คุณยังสามารถเปลี่ยนชื่อตารางแทนการลบโดยใช้ ฉันยังปิดใช้งานตัวเริ่มต้น
NMrt

2

ฉันเพิ่งแก้ไข "ปัญหา" นี้โดย

  1. กำลังลบตาราง "_MigrationHistory" จากฐานข้อมูล
  2. การลบโฟลเดอร์ "การย้ายข้อมูล" ออกจากโครงการ
  3. กำลังอัปเดตไฟล์ EDMX
  4. ทำความสะอาดโครงการและสร้างใหม่

การกำหนดค่าสภาพแวดล้อมของฉันกำลังติดตาม

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0

ฉันขอถามสิ่งที่คุณอัปเดตในไฟล์ EDMX ได้ไหม ฉันกำลังใช้ Database First และยังคงค้นหาตารางการย้ายข้อมูลที่ไม่มีอยู่จริง ... ขอบคุณ!
dalcam

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