Debug dei codici di migrazione Entity Framework per primi


138

Sto usando il codice Entity Framework prima nel mio sito Web e mi chiedo solo se esiste un modo per eseguire il debug dei codici di migrazione. Sai, come impostare punti di interruzione e cose del genere.

Sto usando Package Manager Console per aggiornare il database usando Update-Database.

Grazie


È solo un codice C # standard - quindi sì, certo, puoi impostare dei punti di interruzione in esso .....
marc_s

1
ma l'applicazione in realtà non è in esecuzione poiché sto usando la console di Package Manager.
Daniel,

1
Quindi non eseguire l'aggiornamento dalla console di Gestione pacchetti ma imposta l'inizializzatore di migrazione come inizializzatore predefinito in modo che il database venga migato la prima volta che l'applicazione si connette ad esso.
Wiktor Zychla,

Sto aggiornando il mio database utilizzando il codice di migrazione e non riesco a interrompere l'app ed eseguirlo di nuovo per eseguire l'inizializzatore.
Daniel,

Il motivo per cui non sto usando SQL è che il codice per l'aggiornamento è piuttosto complicato ed è quasi impossibile implementarlo usando SQL.
Daniel,

Risposte:


255

So che EF Code First Migrations è uno strumento relativamente nuovo ma non dimenticare che sei ancora in .NET.

Quindi puoi usare:

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

Dopodiché puoi vedere la tua InnerException.

Oppure puoi usare l'istruzione try ... catch in questo modo: Gestione delle eccezioni Entity Framework


3
Sì, funziona durante l'esecuzione di un database di aggiornamento tramite la console di gestione dei pacchetti. Molto maneggevole!
Tom Ferguson,

11
L'ho aggiunto all'inizio del mio metodo Configuration.Seed. Provoca un popup che consente di selezionare Visual Studio per eseguire il debug del codice. Tuttavia, il mio sistema si blocca quando lo seleziono (forse non correlato).
Talon,

3
Dove mettere questo pezzo di codice? se qualcuno può dare una mano! Grazie.
Aritra B,

4
Nel costruttore della tua classe di configurazione.
Casey,

5
@Talon Go prendi un caffè e al tuo ritorno probabilmente è spuntata un'altra istanza di Visual Studio. :)
Corstian Boerman,

11

Per raggiungere un punto di interruzione in una migrazione db, impostare il contesto su MigrateDatabaseToLatestVersion all'inizializzazione.

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

Quindi esegui il debug come di consueto (esegui usando f5) e il breakpoint raggiungerà la prima volta che esegui il progetto.

Il problema ora è che se esegui il debug una seconda volta la migrazione non verrà eseguita. Questo perché la tabella __MigrationHistory è stata aggiornata per indicare che è stata eseguita la migrazione all'ultima versione. Per ripetere il test della migrazione, aprire la console del gestore pacchetti e eseguire il downgrade alla migrazione precedente:

Update-Database TargetMigration: ThePreviousMigrationName

8

La mia risposta potrebbe essere un po 'sciocca ma comunque qui va. Se tu, come me, a volte hai problemi con il metodo Seed () quello che faccio di solito è semplicemente creare un metodo pubblico che chiama Protect Seed ().

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

quindi nel mio HomeController chiamo questo metodo in modalità Debug.

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

So che è una soluzione un po 'scadente, ma è semplice e veloce. Naturalmente questo deve essere fatto dopo la creazione del modello. Quindi passo dopo passo:

  1. commentare il metodo seed ed eseguire il database di aggiornamento per creare il modello
  2. decommenta il metodo Seed () e plug-in "hack" che ho menzionato sopra.

  3. nella configurazione disabilita Migrazioni automatiche

    AutomaticMigrationsEnabled = false; // se hai disabilitato questa opzione, salta già questo passaggio

  4. Eseguire il debug dell'applicazione, correggere l'errore e rimuovere "hack"


5

Ecco un metodo più a prova di errore che farà il trucco senza troppi problemi:

Passaggio 1: posiziona questo pezzo di codice proprio sopra la migrazione di cui desideri eseguire il 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()
    {
    }
}

Passaggio 2: compilare il progetto contenente le migrazioni

Passaggio 3: aprire una console all'interno della directory di output (/ bin / Debug, / bin / Release ecc.) Contenente la dll delle migrazioni

Passaggio 4: Richiamare migrate.exe con il parametro / scriptFile per avviare il debugger ed eseguire effettivamente il debug della migrazione db desiderata

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

Una volta visualizzata la finestra di dialogo del selettore del debugger, selezionare l'istanza di Visual Studio che è già stata aperta.


4

È possibile aggiungere le istruzioni Console.WriteLine al codice di migrazione (non un'ottima soluzione)

Nota, i messaggi vengono visualizzati solo se si esegue il codice di migrazione utilizzando l' migrate.exeutilità (in pacakges\EntityFramework.x.y.z\tools). Non verranno visualizzati se si esegue la migrazione tramite la console di Package Manager.


Grazie Tom ... Era la risposta più vicina che potevo ottenere. Se nessuno risponde a questa con una soluzione migliore, lo segnerò come risposta. :)
Daniel,

Oppure genera un'eccezione con il tuo messaggio che desideri restituire.
David d C e Freitas,

2

Ho avuto molta fortuna usando "Debugger.Launch ()" (come nella risposta di m_david sopra ) altrove, ma all'interno di CreateDbContext sembra in qualche modo sia attaccare che non attaccare. Ciò che intendo è che si allega e inizia a provare a passare ai file .asm e ai file .cpp (codice interno). Se provo a impostare un punto di interruzione su una console. La linea di comando che CONOSCO viene eseguita in seguito (posso vedere l'output di QUALSIASI "COMANDO di migrazione dotnet ef"), la esegue entrambe e non raggiunge mai il punto di interruzione.

Questo è ciò che ha funzionato per me invece:

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

// Breakpoint after this...

Puoi eseguire la migrazione e collegarti manualmente utilizzando Visual Studio e ti consentirà di scorrere il codice come ti aspetti, è solo una seccatura. Quello che dovrei davvero provare è la combinazione di entrambi i metodi ...


A quale processo ti stai attaccando?
XDS

-1

Ho anche trovato un trucco accurato qui per ottenere i dettagli dell'errore ...

Fondamentalmente, il trucco è quello di prendere tutte le informazioni da un'eccezione, metterle in una stringa e lanciare una nuova DbEntityValidationException con la stringa generata e l'eccezione originale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.