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
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
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
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:
décommentez la méthode Seed () et branchez le "hack" que j'ai mentionné ci-dessus.
dans la configuration, désactivez les migrations automatiques
AutomaticMigrationsEnabled = false; // si cette option est désactivée, ignorez cette étape
Déboguez votre application, corrigez l'erreur et supprimez le "hack"
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.
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.
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 ...
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.