web-dev-qa-db-fra.com

Déboguer le code, d'abord les codes de migration Entity Framework

J'utilise d'abord le code Entity Framework sur mon site Web et je me demande simplement s'il existe un moyen de déboguer les codes de migration. Vous savez, comme définir des points d'arrêt et des choses comme ça.

J'utilise Package Manager Console pour mettre à jour la base de données à l'aide de Update-Database.

Merci

127
Daniel

Je sais que EF Code First Migrations est un outil relativement récent, mais n'oubliez pas que vous êtes toujours en .NET.

Pour que vous puissiez utiliser:

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

Après cela, vous pouvez voir votre InnerException.

Ou vous pouvez utiliser la commande try ... catch comme ceci: Exception Handle Entity Framework

242
m_david

Pour atteindre un point d'arrêt dans une migration de base de données, définissez le contexte sur MigrateDatabaseToLatestVersion à l'initialisation.

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

Ensuite, vous venez de déboguer normalement (exécuté avec f5) et le point d'arrêt atteindra la première fois que vous exécutez le projet.

Le problème est maintenant que si vous déboguez une seconde fois, la migration ne sera pas exécutée. En effet, la table __ MigrationHistory a été mise à jour pour indiquer que vous avez migré vers la dernière version. Pour tester à nouveau la migration, ouvrez la console du gestionnaire de packages et rétablissez la migration précédente:

Update-Database –TargetMigration: ThePreviousMigrationName
11
robasaurus

Ma réponse est peut-être un peu bête, mais bon, ça y est. Si, comme moi, vous rencontrez parfois des problèmes avec la méthode Seed (), je crée généralement une méthode publique qui appelle Protect Seed ().

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

j'appelle ensuite cette méthode dans mon HomeController en mode débogage.

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

Je sais que c'est une solution un peu boiteuse, mais c'est simple et rapide. Bien sûr, cela doit être fait après la création du modèle. Donc, étape par étape:

  1. commentez la méthode de départ et exécutez la base de données update pour créer le modèle
  2. décommentez la méthode Seed () et branchez le "hack" que j'ai mentionné ci-dessus.

  3. dans la configuration, désactivez les migrations automatiques

    AutomaticMigrationsEnabled = false; // si cette option est désactivée, ignorez cette étape

  4. Déboguez votre application, corrigez l'erreur et supprimez le "hack"

8
Rui Lima

Vous pouvez ajouter des instructions Console.WriteLine au code de migration (solution déconseillée)

Remarque: les messages ne sont affichés que si vous exécutez le code de migration à l'aide de la commande migrate.exe utilité (dans pacakges\EntityFramework.x.y.z\tools). Ils ne s'afficheront pas si vous exécutez la migration via la console du gestionnaire de packages.

4
Tom Ferguson

Voici une méthode plus infaillible qui fera l'affaire sans grande difficulté:

Étape n ° 1: Placez ce morceau de code juste au-dessus de la migration que vous souhaitez déboguer:

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()
    {
    }
}

Étape n ° 2: Compilez le projet contenant vos migrations

Étape n ° 3: Ouvrez une console dans le répertoire de sortie (/ bin/Debug,/bin/Release etc.) contenant la dll de vos migrations.

Étape 4: appelez migrate.exe avec le paramètre/scriptFile pour lancer le débogueur et déboguer le db-migration souhaité

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

Une fois que la boîte de dialogue sélecteur de débogueur apparaît, choisissez l'instance de Visual Studio que vous avez déjà ouverte.

3
XDS

J'ai eu beaucoup de chance en utilisant "Debugger.Launch ()" (comme dans réponse de m_david ci-dessus ), mais à l'intérieur de CreateDbContext, il semble en quelque sorte à la fois attacher et non attacher. Ce que je veux dire, c’est qu’il s’attache et commence à essayer d’entrer dans les fichiers .asm et les fichiers .cpp (code interne). Si j'essaie de définir un point d'arrêt sur une console.Le script que je sais est exécuté par la suite (je peux voir le résultat de TOUT "COMMANDE de migration de dotnet ef"), il l'exécute et ne parvient jamais à atteindre le point d'arrêt.

Voici ce qui a fonctionné pour moi à la place:

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

// Breakpoint after this...

Vous pouvez exécuter la migration et attacher manuellement à l'aide de Visual Studio et cela sera vous permet de parcourir le code comme prévu, ce qui est encore plus pénible. Ce que je devrais vraiment essayer, c'est la combinaison des deux méthodes ...

2
Brent Rittenhouse

J'ai aussi trouvé une astuce géniale ici pour obtenir les détails de l'erreur ...

Essentiellement, l'astuce consiste à récupérer toutes les informations d'une exception, à les placer dans une chaîne et à générer une nouvelle exception DbEntityValidationException avec la chaîne générée et l'exception d'origine.

0
ghigad