Saya menggunakan kode Entity Framework terlebih dahulu di situs web saya dan saya hanya ingin tahu apakah ada cara untuk men-debug kode migrasi. Anda tahu, seperti mengatur breakpoint dan hal-hal seperti ini.
Saya menggunakan Package Manager Console untuk memperbarui database menggunakan Update-Database
.
Terima kasih
Jawaban:
Saya tahu bahwa EF Code First Migrations adalah alat yang relatif baru tetapi jangan lupa tentang Anda masih menggunakan .NET.
Jadi Anda bisa menggunakan:
if (System.Diagnostics.Debugger.IsAttached == false) { System.Diagnostics.Debugger.Launch(); }
Setelah itu Anda bisa melihat InnerException Anda.
Atau Anda dapat menggunakan pernyataan try ... catch seperti ini: Exception handling Entity Framework
sumber
Untuk mencapai titik istirahat dalam migrasi db, setel konteks ke MigrateDatabaseToLatestVersion saat menginisialisasi.
Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());
Kemudian Anda hanya men-debug seperti biasa (menjalankan menggunakan f5) dan breakpoint akan mencapai saat pertama kali Anda menjalankan proyek.
Masalahnya sekarang adalah jika Anda men-debug untuk kedua kalinya, migrasi tidak akan berjalan. Ini karena tabel __MigrationHistory telah diperbarui untuk menyatakan Anda telah bermigrasi ke versi terbaru. Untuk menguji ulang migrasi, buka konsol pengelola paket dan turunkan ke migrasi sebelumnya:
Update-Database –TargetMigration: ThePreviousMigrationName
sumber
Jawaban saya mungkin agak konyol tapi begini saja. Jika Anda, seperti saya, beberapa kali mengalami masalah dalam metode Seed () yang biasanya saya lakukan hanyalah membuat metode publik yang memanggil Protect Seed ().
public void SeedDebug(AppDbContext context) { Seed(context); }
kemudian di HomeController saya, saya memanggil metode ini dalam mode Debug.
public class HomeController : Controller { var appDb = new AppDbContext(); public ActionResult Index() { var config = new Configuration(); config.SeedDebug(appDb); return View(); } }
Saya tahu ini solusi yang agak payah, tetapi sederhana dan cepat. Tentu saja ini harus dilakukan setelah model dibuat. Jadi selangkah demi selangkah:
hapus komentar pada metode Seed () dan pasang "hack" yang saya sebutkan di atas.
dalam konfigurasi nonaktifkan Migrasi otomatis
AutomaticMigrationsEnabled = false; // jika Anda menonaktifkannya, lewati langkah ini
Debug aplikasi Anda, perbaiki kesalahan dan hapus "retas"
sumber
Berikut metode yang lebih anti-gagal yang akan melakukan trik tanpa banyak keributan:
Langkah # 1: Tempatkan potongan kode ini tepat di atas migrasi yang ingin Anda debug:
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() { } }
Langkah # 2: Kompilasi proyek yang berisi migrasi Anda
Langkah # 3: Buka konsol di dalam direktori output (/ bin / Debug, / bin / Release dll) yang berisi dll dari migrasi Anda
Langkah # 4: Panggil migrate.exe dengan parameter / scriptFile untuk meluncurkan debugger dan benar-benar men-debug db-migrasi yang diinginkan
migrate.exe "Your.Migrations.Assembly.dll" /scriptFile="foo.sql" /verbose /startupConfigurationFile="Your.Migrations.Assembly.config"
Setelah dialog debugger-selector muncul, pilih instance studio visual yang telah Anda buka.
sumber
Anda dapat menambahkan pernyataan Console.WriteLine ke kode migrasi (bukan solusi yang bagus)
Perhatikan, pesan hanya ditampilkan jika Anda menjalankan kode migrasi menggunakan
migrate.exe
utilitas (dalampacakges\EntityFramework.x.y.z\tools
). Mereka tidak akan ditampilkan jika Anda menjalankan migrasi melalui konsol Package Manager.sumber
Saya sangat beruntung menggunakan "Debugger.Launch ()" (seperti dalam jawaban m_david di atas ) di tempat lain, tetapi di dalam CreateDbContext tampaknya entah bagaimana bisa dilampirkan, dan tidak dilampirkan. Yang saya maksud adalah, itu melampirkan dan mulai mencoba masuk ke file .asm dan file .cpp (kode internal). Jika saya mencoba untuk mengatur breakpoint pada Console.Writeline yang saya TAHU akan dieksekusi setelahnya (saya dapat melihat output dari SETIAP "PERINTAH migrasi dotnet ef") keduanya mengeksekusinya dan tidak pernah mencapai breakpoint.
Inilah yang berhasil untuk saya:
while (!System.Diagnostics.Debugger.IsAttached) System.Threading.Thread.Sleep(10); // Breakpoint after this...
Anda dapat menjalankan migrasi dan melampirkan secara manual menggunakan Visual Studio dan itu benar - benar akan memungkinkan Anda melangkah melalui kode seperti yang Anda harapkan, itu hanya lebih merepotkan. Yang harus saya coba adalah kombinasi dari kedua metode ...
sumber
Saya juga menemukan trik rapi di sini untuk mendapatkan detail kesalahan ...
Pada dasarnya, triknya adalah mengambil semua informasi dari pengecualian, memasukkannya ke dalam string dan melempar DbEntityValidationException baru dengan string yang dihasilkan dan pengecualian asli.
sumber