786 votes

Comment puis-je visualiser le SQL généré par Entity Framework ?

Comment puis-je voir le SQL généré par entity framework ?

(Dans mon cas particulier, j'utilise le fournisseur mysql - si cela importe)

2 votes

Cet article du MSDN Magazine décrit certaines options de profilage pour Entity Framework 4

3 votes

La question "duplicate" liée est pour LINQ to SQL, donc ce n'est pas réellement un doublon.

3 votes

Lors de l'exécution sous le débogueur, IntelliTrace montre les requêtes SQL effectuées, bien que sans leurs résultats.

1120voto

Matt Nibecker Points 941

Pour ceux qui utilisent Entity Framework 6 et plus (pas dans EF CORE - voir le commentaire ci-dessous), si vous souhaitez consulter le SQL généré dans Visual Studio (comme je l'ai fait), vous devez utiliser la nouvelle fonctionnalité de journalisation/interception.

Ajouter la ligne suivante affichera le SQL généré (avec des détails supplémentaires liés à l'exécution) dans le panneau de sortie de Visual Studio :

using (MyDatabaseEntities context = new MyDatabaseEntities())
{
    context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
    // interroger la base de données en utilisant EF ici.
}

Plus d'informations sur la journalisation dans EF6 dans cette série de blogs intéressante : http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/

Remarque : Assurez-vous que vous exécutez votre projet en mode DEBUG.

115 votes

Cette réponse mérite plus d'amour (si vous utilisez EF6+) - excellent ajout pour le débogage, il suffit de l'ajouter dans le constructeur DBContext (this.Database.Log = ...)

0 votes

@vittore - en fait, j'utilise EF6.1.0; et comme vous l'avez dit, cela ne fonctionne pas lors de la construction en indiquant : Impossible de créer un délégué avec 'System.Diagnostics.Debug.WriteLine(string)' car il a un attribut conditionnel. Cependant, la réponse ci-dessus fonctionne bien !

0 votes

@StephenLautier Je dois reformuler mon commentaire ou le supprimer, en fait sans lambda il ne fonctionnera que à partir de la fenêtre de commande.

547voto

Nick Berardi Points 31361

Vous pouvez faire ce qui suit :

IQueryable query = from x in appEntities
             where x.id == 32
             select x;

var sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString();

ou en EF6 :

var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query)
            .ToTraceString();

ou en EF6.3+ :

var sql = ((dynamic)flooringStoresProducts).Sql;

Cela vous donnera le SQL qui a été généré.

22 votes

Vous n'obtiendrez pas de SQL pour les requêtes se terminant par .Single(), .Count(), .Any(), etc. de cette manière.

29 votes

C'est parce qu'après l'exécution de .Single(), votre objet n'est plus de type IQueryable, je suppose.

14 votes

Avec EF6, je ne pouvais le faire qu'avec la réflexion. mais d'abord, j'ai dû convertir le result en System.Data.Entity.Infrastructure.DbQuery, puis obtenir la propriété interne InternalQuery comme (System.Data.Entity.Internal.Linq.InternalQuery), et seulement ensuite, utiliser ToTraceString()

96voto

isepise Points 61

À partir de EF6.1, vous pouvez utiliser des intercepteurs pour enregistrer un journal de base de données. Voir les chapitres "Interceptors" et "Logging Database Operations" vers un fichier ici

1 votes

Article de blog sur le sujet blog.oneunicorn.com/2014/02/09/…

17 votes

Précision, C'est sous : ...

88voto

Doug Clutter Points 1332

Si vous utilisez un DbContext, vous pouvez utiliser .ToString() pour obtenir le SQL :

var result = from i in myContext.appEntities
             select new Model
             {
                 field = i.stuff,
             };
var sql = result.ToString();

16 votes

ToString() vous donnera la requête avec des variables dedans, comme p__linq__0, au lieu des valeurs finales (par exemple: 34563 au lieu de p__linq__0)

14voto

Benjamin Pollack Points 10458

Il y a deux façons :

  1. Pour voir le SQL qui sera généré, il suffit d'appeler ToTraceString(). Vous pouvez l'ajouter dans votre fenêtre de surveillance et définir un point d'arrêt pour voir quelle serait la requête à un moment donné pour n'importe quelle requête LINQ.
  2. Vous pouvez attacher une trace à votre serveur SQL choisi, ce qui vous montrera la requête finale dans tous les détails. Dans le cas de MySQL, le moyen le plus simple de tracer les requêtes est tout simplement de suivre le journal des requêtes avec tail -f. Vous pouvez en savoir plus sur les installations de journalisation de MySQL dans la documentation officielle. Pour SQL Server, la manière la plus simple est d'utiliser le profileur inclus de SQL Server.

38 votes

Le ToTraceString de quoi ?

0 votes

Le ObjectQuery, comme Nick l'a noté juste après avoir publié ma réponse.

2 votes

SQL Server Profiler capture les premiers 4000 caractères, mais les requêtes EF peuvent être beaucoup plus longues que cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X