À 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 .
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?
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");
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:
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);
}
}
}
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);
...
}
où ConsoleLoggerFactory
a été défini précédemment comme ceci:
private static readonly LoggerFactory ConsoleLoggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) });