Comment puis-je voir le SQL généré par entity framework ?
(Dans mon cas particulier, j'utilise le fournisseur mysql - si cela importe)
Comment puis-je voir le SQL généré par entity framework ?
(Dans mon cas particulier, j'utilise le fournisseur mysql - si cela importe)
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.
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 = ...)
@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 !
@StephenLautier Je dois reformuler mon commentaire ou le supprimer, en fait sans lambda il ne fonctionnera que à partir de la fenêtre de commande.
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é.
Vous n'obtiendrez pas de SQL pour les requêtes se terminant par .Single(), .Count(), .Any(), etc. de cette manière.
C'est parce qu'après l'exécution de .Single()
, votre objet n'est plus de type IQueryable
, je suppose.
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()
Il y a deux façons :
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.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. 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.
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.
1 votes
Si vous êtes intéressé à voir le SQL pendant le développement, vous pouvez utiliser LINQPad. Lorsque vous exécutez une requête LINQ, il y aura un onglet SQL dans les résultats qui montre la déclaration SQL exécutée. Pour mySQL, vous devrez installer un pilote. Je n'ai pas de base de données mySQL disponible, mais cela devrait fonctionner.
1 votes
La quantité de réponses compliquées à cette question me fait reconsidérer EF. Cela semble être une fonction très basique dans un ORM.
0 votes
La plupart des méthodes que j'ai vues ne semblent pas fonctionner pour moi, mais j'ai finalement réussi à obtenir quelque chose comme ceci à fonctionner en utilisant EF 6.4 var sql = ((dynamic)result).ToString();