Implementing Missing Features in Entity Framework Core – Part 8: Logging to the Console
This is the eight post in a series of posts about bringing the features that were present in Entity Framework pre-Core into EF Core. The others are:
-
Part 1: Introduction, Find, Getting an Entity’s Id Programmatically, Reload, Local, Evict
-
Part 2: Explicit Loading
-
Part 3: Validations
-
Part 4: Conventions
-
Part 5: Getting the SQL for a Query
-
Part 6: Lazy Loading
-
Part 7: Entity Configuration in Mapping Classes
This time I’m going to talk about the possibility to log the generated SQL to the output. In the past, we could do it by assigning a writer to DbContext.Database.Log:
ctx.Database.Log = Console.Log;
var loggerFactory = new LoggerFactory()
.AddDebug((categoryName, logLevel) => (logLevel == LogLevel.Information) && (categoryName == DbLoggerCategory.Database.Command.Name))
.AddConsole((categoryName, logLevel) => (logLevel == LogLevel.Information) && (categoryName == DbLoggerCategory.Database.Command.Name));
var optionsBuilder = new DbContextOptionsBuilder<MyContext>()
.UseLoggerFactory(loggerFactory)
.UseSqlServer(@"<connectionString>");
var ctx = new MyContext(optionsBuilder.Options);
Then, we are creating a DbContextOptionsBuilder and in it we are replacing the default logger factory with our own. We then use it to create an option which we pass to our DbContext’s constructor, or we could do the same in the OnConfiguring method.
The output will look something like this:
SELECT [p].[ProjectId], [p].[CreatedAt], [p].[CreatedBy], [p].[CustomerId], [p].[Description], [p].[End], [p].[Name], [p].[Start], [p].[UpdatedAt], [p].[UpdatedBy]Hope this helps!
FROM [Projects] AS [p]