แก้ไขข้อผิดพลาดรหัสโยกย้าย Entity Framework รหัสแรก


138

ฉันใช้รหัส Entity Framework เป็นครั้งแรกในเว็บไซต์ของฉันและฉันแค่สงสัยว่าจะมีวิธีใดในการแก้ไขข้อบกพร่องของรหัสการโยกย้าย คุณก็รู้เช่นเดียวกับการตั้งจุดพักและสิ่งต่าง ๆ เช่นนี้

Update-Databaseฉันใช้คอนโซลการจัดการแพคเกจการปรับปรุงฐานข้อมูลโดยใช้

ขอบคุณ


มันเป็นแค่รหัส C # มาตรฐานดังนั้นใช่แน่นอนคุณสามารถกำหนดจุดพักได้ .....
marc_s

1
แต่แอปพลิเคชันไม่ทำงานจริงเนื่องจากฉันใช้ Package Manager Console
Daniel

1
จากนั้นอย่าอัปเกรดจากคอนโซลตัวจัดการแพคเกจ แต่ตั้งค่าการเริ่มต้นการย้ายข้อมูลเป็นค่าเริ่มต้นเริ่มต้นเพื่อให้ฐานข้อมูลถูกย้ายในครั้งแรกที่แอปพลิเคชันของคุณเชื่อมต่อ
Wiktor Zychla

ฉันอัปเดตฐานข้อมูลของฉันโดยใช้รหัสการโยกย้ายและฉันไม่สามารถหยุดแอพและเรียกใช้อีกครั้งเพื่อเรียกใช้ initializer
Daniel

เหตุผลที่ฉันไม่ได้ใช้ SQL เป็นรหัสสำหรับการอัปเดตค่อนข้างซับซ้อนและแทบจะเป็นไปไม่ได้เลยที่จะใช้งานโดยใช้ SQL
Daniel

คำตอบ:


255

ฉันรู้ว่า EF Code First Migrations เป็นเครื่องมือที่ค่อนข้างใหม่ แต่อย่าลืมว่าคุณยังอยู่ใน. NET

ดังนั้นคุณสามารถใช้:

if (System.Diagnostics.Debugger.IsAttached == false)
{
    System.Diagnostics.Debugger.Launch();
}

หลังจากนั้นคุณสามารถเห็น InnerException ของคุณ

หรือคุณสามารถใช้ลอง ... catch คำสั่งนี้: Exception handling Entity Framework


3
ใช่สิ่งนี้ใช้ได้ในขณะที่รันฐานข้อมูล Update ผ่านคอนโซลตัวจัดการแพคเกจ มีประโยชน์มาก!
ทอมเฟอร์กูสัน

11
ฉันเพิ่มสิ่งนี้ไว้ที่ด้านบนของวิธีการกำหนดค่าความเร็ว มันทำให้ป๊อปอัพที่ให้คุณเลือก Visual Studio ของคุณเพื่อแก้จุดบกพร่องรหัส อย่างไรก็ตามระบบของฉันค้างเมื่อฉันเลือก (อาจไม่เกี่ยวข้อง)
กรงเล็บ

3
วางรหัสนี้ไว้ที่ไหน? ถ้าใครสามารถช่วยออก! ขอบคุณ
Aritra B

4
ในตัวสร้างคลาสการกำหนดค่าของคุณ
Casey

5
@Talon Go คว้ากาแฟและเมื่อถึงเวลาที่คุณอาจกลับมามีอินสแตนซ์ Visual Studio อีกอันหนึ่งโผล่ขึ้นมา :)
Corstian Boerman

11

หากต้องการไปที่จุดหยุดในการย้ายฐานข้อมูล db ให้ตั้งค่าบริบทเป็น MigrateDatabaseToLatestVersion บน initialise

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());

จากนั้นคุณเพิ่งดีบักตามปกติ (เรียกใช้ f5) และเบรกพอยต์จะเข้าสู่ครั้งแรกที่คุณเรียกใช้โครงการ

ปัญหาตอนนี้คือถ้าคุณดีบักครั้งที่สองการโยกย้ายจะไม่ทำงาน นี่เป็นเพราะตาราง__MigrationHistoryได้รับการอัปเดตเพื่อบอกว่าคุณได้ย้ายไปเป็นเวอร์ชั่นล่าสุดแล้ว หากต้องการทดสอบการโยกย้ายอีกครั้งให้เปิดคอนโซลตัวจัดการแพคเกจและปรับลดรุ่นเป็นการโยกย้ายครั้งก่อน:

Update-Database TargetMigration: ThePreviousMigrationName

8

คำตอบของฉันอาจจะงี่เง่า แต่ต่อไปมันจะไป หากคุณเช่นฉันบางครั้งมีปัญหาในวิธีการ Seed () สิ่งที่ฉันมักทำคือเพียงสร้างวิธีการสาธารณะที่เรียกว่า Protect Seed ()

public void SeedDebug(AppDbContext context)
{
    Seed(context);
}

จากนั้นใน HomeController ของฉันฉันเรียกวิธีนี้ในโหมดดีบั๊ก

public class HomeController : Controller
{
    var appDb = new AppDbContext();
    public ActionResult Index()
    {
        var config = new Configuration();
        config.SeedDebug(appDb);
        return View();
    }
}

ฉันรู้ว่ามันเป็นวิธีแก้ปัญหาเล็กน้อย แต่มันง่ายและรวดเร็ว แน่นอนว่าต้องทำหลังจากสร้างโมเดลแล้ว ดังนั้นทีละขั้นตอน:

  1. แสดงความคิดเห็นวิธีการเมล็ดและดำเนินการปรับปรุงฐานข้อมูลเพื่อสร้างแบบจำลอง
  2. uncomment วิธี Seed () และปลั๊กอิน "แฮ็ค" ฉันกล่าวถึงข้างต้น

  3. ในการกำหนดค่าปิดใช้งานการย้ายข้อมูลอัตโนมัติ

    AutomaticMigrationsEnabled = false; // หากคุณปิดใช้งานตัวนี้ไปแล้วข้ามขั้นตอนนี้ไป

  4. แก้ไขข้อบกพร่องแอปพลิเคชันของคุณแก้ไขข้อผิดพลาดและลบ "แฮ็ค"


5

ต่อไปนี้เป็นวิธีการป้องกันข้อผิดพลาดที่จะทำเคล็ดลับโดยไม่ต้องยุ่งยากมาก:

ขั้นตอนที่ # 1: วางรหัสชิ้นนี้ไว้ด้านบนการโยกย้ายที่คุณต้องการแก้ปัญหา:

public partial class ORACLE_Test : DbMigration
{
    public override void Up()
    {
        if (!System.Diagnostics.Debugger.IsAttached)
            System.Diagnostics.Debugger.Launch();

        AddColumn("TEST", "UR_USER_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
        AddColumn("TEST", "UR_CLIENT_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
        [...]
    }

    public override void Down()
    {
    }
}

ขั้นตอนที่ 2: รวบรวมโครงการที่มีการย้ายข้อมูลของคุณ

ขั้นตอนที่ # 3: เปิดคอนโซลภายในไดเรกทอรีผลลัพธ์ (/ bin / Debug, / bin / Release ฯลฯ ) ที่มี dll การย้ายข้อมูลของคุณ

ขั้นตอนที่ # 4: เรียกใช้ migrate.exe ด้วยพารามิเตอร์ / scriptFile เพื่อเรียกใช้ดีบักเกอร์และทำการดีบัก db-migration ที่ต้องการจริงๆ

migrate.exe "Your.Migrations.Assembly.dll" /scriptFile="foo.sql" /verbose /startupConfigurationFile="Your.Migrations.Assembly.config"

เมื่อกล่องโต้ตอบตัวเลือกดีบักเกอร์ปรากฏขึ้นให้เลือกอินสแตนซ์ของ visual studio ที่คุณเปิดไว้แล้ว


4

คุณสามารถเพิ่มคำสั่ง Console.WriteLine ลงในรหัสการโยกย้าย (ไม่ใช่โซลูชันที่ยอดเยี่ยม)

หมายเหตุข้อความจะปรากฏขึ้นต่อเมื่อคุณเรียกใช้รหัสการโยกย้ายโดยใช้migrate.exeโปรแกรมอรรถประโยชน์ (ในpacakges\EntityFramework.x.y.z\tools) จะไม่แสดงหากคุณเรียกใช้การย้ายข้อมูลผ่านคอนโซลตัวจัดการแพคเกจ


ขอบคุณทอม ... มันเป็นคำตอบที่ใกล้เคียงที่สุดที่ฉันจะได้รับ หากไม่มีใครตอบคำถามนี้ด้วยทางออกที่ดีกว่าฉันจะทำเครื่องหมายว่าเป็นคำตอบ :)
Daniel

หรือส่งข้อยกเว้นพร้อมข้อความที่คุณต้องการส่งคืน
David d C e Freitas

2

ฉันโชคดีมากที่ใช้ "Debugger.Launch ()" (เหมือนในคำตอบของ m_david ด้านบน ) ที่อื่น ๆ แต่ข้างในของ CreateDbContext ดูเหมือนว่าจะแนบและไม่แนบ สิ่งที่ฉันหมายถึงคือมันแนบและเริ่มพยายามก้าวเข้าสู่ไฟล์. asm และไฟล์. cpp (รหัสภายใน) ถ้าฉันพยายามตั้งค่าเบรกพอยต์บน Console.Writeline ที่ฉันรู้ว่าจะถูกดำเนินการในภายหลัง (ฉันสามารถดูผลลัพธ์จาก "การ dotnet ef migrations COMMAND" ใด ๆ ) มันทั้งคู่ดำเนินการและไม่กระทบกับจุดพัก

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉันแทน:

while (!System.Diagnostics.Debugger.IsAttached)
    System.Threading.Thread.Sleep(10);

// Breakpoint after this...

คุณสามารถดำเนินการย้ายข้อมูลและแนบไฟล์ด้วยตนเองโดยใช้ Visual Studio และจะช่วยให้คุณสามารถดูรหัสได้ตามที่คุณคาดหวัง สิ่งที่ฉันควรลองจริง ๆ คือการรวมกันของทั้งสองวิธี ...


คุณติดกับกระบวนการใด?
XDS

-1

ฉันยังพบกลอุบายที่นี่เพื่อรับรายละเอียดข้อผิดพลาด ...

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

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