web-dev-qa-db-fra.com

Comment affichez-vous la requête SQL sous-jacente dans EF Core 2.0?

À 3:15 de la fin de cette vidéo " .NET Core 2.0 Released! ", Diego Vega présente une démonstration des nouvelles fonctionnalités d'Entity Framework Core 2.0. Dans ce cadre, un vidage du code SQL sous-jacent est affiché dans l'application console .

enter image description here

J'ai vu de nombreuses réponses sur Stack Overflow suggérant que les utilisateurs utilisent un profileur SQL pour afficher les requêtes sous-jacentes. Mais maintenant, je suis curieux: comment pouvez-vous faire ce que Diego Vega a fait et faire en sorte que la requête soit affichée dans l'application?

23
Gigi

https://docs.Microsoft.com/en-us/ef/core/miscellaneous/logging

Dans la méthode OnConfiguring de DbContext, vous pouvez définir votre enregistreur, la console de connexion est un type prédéfini, utilisez simplement this NuGet . Notez que l'utilisation du modèle Factory est une pratique recommandée pour les instances de consignateur.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
        .UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
12
Antonio Campagnaro

Bonjour, vous pouvez procéder comme suit pour afficher le code SQL généré par Entity Framework Core dans la fenêtre de sortie. Dans votre classe DbContext:

public static readonly Microsoft.Extensions.Logging.LoggerFactory _myLoggerFactory = 
new LoggerFactory(new[] { 
new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() 
});

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseLoggerFactory(_myLoggerFactory);
}

Le consignateur de débogage écrit des messages dans la fenêtre de sortie du débogage uniquement lorsqu'un débogueur est attaché.

Vous devrez faire ce qui suit:

  • using Microsoft.Extensions.Logging;
  • Installez le paquet nuget: Microsoft.Extensions.Logging.Debug
33
Mohammad

Je suis sûr que la réponse acceptée fonctionne, mais je voulais savoir comment faire cela avec DI, alors ...

private readonly ILoggerFactory loggerFactory;  

public MyDataContext(DbContextOptions<MyDataContext> options, ILoggerFactory loggerFactory)
        : base(options)
{
    this.loggerFactory = loggerFactory;
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)  
{
    // Allow null if you are using an IDesignTimeDbContextFactory
    if (loggerFactory != null)
    { 
        if (Debugger.IsAttached)
        {
            // Probably shouldn't log sql statements in production
            optionsBuilder.UseLoggerFactory(this.loggerFactory); 
        }
    }
} 
1
rstackhouse

Si vous écrivez une API ou un service d'application basé sur l'infrastructure ASP.NET Core MVC, vous pouvez activer la journalisation SQL dans votre Startup.cs classe comme ça

public void ConfigureServices(IServiceCollection services)
{
    ...

    Action<DbContextOptionsBuilder> dbOptionsContextBuilder = builder => 
        {
        builder.UseSqlServer(Configuration.DbConnection)  // Configuration.DbConnection is the db connection string
               .UseLoggerFactory(ConsoleLoggerFactory);   // Logs out SQL
        };

    services.AddDbContext<YourDatabaseContext>(dbOptionsContextBuilder);


    ...
}

ConsoleLoggerFactory a été défini précédemment comme ceci:

private static readonly LoggerFactory ConsoleLoggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) });
0
Peter