Debug code-first Entity Framework kode migrasi

140

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

Daniel
sumber
Ini hanya kode C # standar - jadi ya, tentu saja, Anda dapat mengatur breakpoint di dalamnya .....
marc_s
1
tetapi aplikasi sebenarnya tidak berjalan karena saya menggunakan Package Manager Console.
Daniel
1
Kemudian jangan memutakhirkan dari konsol Manajer paket tetapi setel penginisialisasi migrasi sebagai penginisialisasi default sehingga database dimigrasi saat pertama kali aplikasi Anda terhubung ke database.
Wiktor Zychla
Saya memperbarui database saya dengan menggunakan kode migrasi dan saya tidak bisa menghentikan aplikasi dan menjalankannya lagi untuk menjalankan penginisialisasi.
Daniel
Alasan saya tidak menggunakan SQL adalah karena kode untuk pembaruannya agak rumit dan hampir tidak mungkin untuk menerapkannya menggunakan SQL.
Daniel

Jawaban:

258

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

m_david
sumber
3
Ya, ini berfungsi saat menjalankan Update-Database melalui konsol manajer paket. Sangat berguna!
Tom Ferguson
11
Saya menambahkan ini ke bagian atas metode Configuration.Seed saya. Ini menyebabkan munculan yang memungkinkan Anda memilih Visual Studio Anda untuk men-debug kode. Namun, sistem saya hang saat saya memilihnya (mungkin tidak terkait).
Talon
3
Di mana meletakkan potongan kode ini? jika ada yang bisa membantu! Terima kasih.
Aritra B
4
Di konstruktor kelas konfigurasi Anda.
Casey
5
@Talon Go ambil kopi dan pada saat Anda kembali mungkin contoh Visual Studio lain muncul. :)
Corstian Boerman
11

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
robasaurus
sumber
8

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:

  1. komentar metode seed dan jalankan update-database untuk membuat model
  2. hapus komentar pada metode Seed () dan pasang "hack" yang saya sebutkan di atas.

  3. dalam konfigurasi nonaktifkan Migrasi otomatis

    AutomaticMigrationsEnabled = false; // jika Anda menonaktifkannya, lewati langkah ini

  4. Debug aplikasi Anda, perbaiki kesalahan dan hapus "retas"

Rui Lima
sumber
6

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.

XDS
sumber
4

Anda dapat menambahkan pernyataan Console.WriteLine ke kode migrasi (bukan solusi yang bagus)

Perhatikan, pesan hanya ditampilkan jika Anda menjalankan kode migrasi menggunakan migrate.exeutilitas (dalam pacakges\EntityFramework.x.y.z\tools). Mereka tidak akan ditampilkan jika Anda menjalankan migrasi melalui konsol Package Manager.

Tom Ferguson
sumber
Terima kasih Tom ... Itu adalah jawaban terdekat yang bisa saya dapatkan. Jika tidak ada yang menjawab ini dengan solusi yang lebih baik, saya akan menandainya sebagai jawaban. :)
Daniel
Atau lemparkan Pengecualian dengan pesan Anda yang ingin Anda kembalikan.
David d C e Freitas
2

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 ...

Brent Rittenhouse
sumber
Proses mana yang Anda lampirkan?
XDS
0

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.

ghigad
sumber