Как вы показываете базовый SQL-запрос в EF Core 2.0?
В 3:15 с конца этого выпуска " .NET Core 2.0 выпущено! " Diego Vega демонстрирует демо-версию новых функций в Entity Framework Core 2.0. Как часть этого, дамп базового SQL отображается в консольном приложении.
Я видел много ответов на Stack Overflow, предлагая, чтобы люди использовали профилировщик SQL для просмотра базовых запросов. Но теперь мне любопытно: как вы можете сделать то, что сделал Диего Вега, и получить запрос, чтобы показать там прямо в приложении?
Ответы
Ответ 1
https://docs.microsoft.com/en-us/ef/core/miscellaneous/logging
В методе OnConfiguring DbContext
вы можете установить свой регистратор, вход в консоль - это предопределенный тип, просто используйте этот NuGet. Обратите внимание, что использование фабричного шаблона - лучший способ для экземпляров регистратора.
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");
Ответ 2
Привет, вы можете сделать что-то вроде следующего, чтобы отобразить созданный sql-код Entity Framework Core в окне вывода. В вашем классе 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);
}
Журнал отладки записывает сообщения в окно вывода отладки только при подключении отладчика.
Вам нужно будет сделать следующее:
- используя Microsoft.Extensions.Logging;
- Установить пакет nuget: Microsoft.Extensions.Logging.Debug
Ответ 3
Я уверен, что принятый ответ работает, но я хотел знать, как это сделать, используя DI, чтобы...
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);
}
}
}
Ответ 4
Я следовал инструкциям Мухаммеда и смог захватить базовый SQL.
Хотя это немного не по теме, мне нужна некоторая помощь в отношении сбоя UPDATE (именно поэтому мне нужно было увидеть SQL, сгенерированный EF). У меня есть эта таблица, которая имеет составной ПК (два целых поля). Когда я вызываю обновление в первой записи таблицы (значения PK равны 0 и 1), SQL - это не оператор UPDATE, а INSERT INTO, который не выполняется в ограничении PK. Когда я вызываю update для любой другой записи, все работает нормально: myContext.Update(objectToUpdate); myContext.SaveChanges();
Ответ 5
Если вы пишете API или службу приложений на основе ASP.NET Core MVC, вы можете включить ведение журнала SQL в своем классе Startup.cs
, например, так:
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
был определен ранее примерно так:
private static readonly LoggerFactory ConsoleLoggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) });