Еще в октябре я сделал сообщение Entity Framework Core: Logging, в котором рассказывается о включении ведения журнала для Entity Framework Core. Этот пост расширяет предыдущий пост и показывает, как получить значения параметров, используемых в запросах, в дополнение к используемым операторам SQL.

Обзор

В этом посте не будет рассказываться о том, как настроить регистратор. Подробности см. В этом предыдущем посте. Ниже приводится информация, которую вы получаете в журнале на основе предыдущего сообщения.

Microsoft.EntityFrameworkCore.Database.Command[20101] Executed DbCommand (41ms) [Parameters=[@__id_0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30'] SELECT TOP(2) [m].[Id], [m].[Address], [m].[City], [m].[Email], [m].[Name], [m].[Phone], [m].[PostalCode], [m].[State] FROM [Contact] AS [m] WHERE [m].[Id] = @__id_0

Это полезно, когда вам нужно проверить запросы, которые создает Entity Framework, но если вы пытаетесь отследить проблему, связанную с данными, незнание используемых значений параметров может стать проблемой.

Включить значения параметров в журнале

Entity Framework Core предоставляет возможность включить регистрацию конфиденциальных данных. Чтобы включить этот параметр, откройте класс Startup и в функции ConfigureServices внесите следующие изменения в вызов AddDbContext для DbContext вы хотите, чтобы опция была включена для.

Before: services .AddDbContext<ContactsContext>(options => options.UseSqlServer(Configuration["Data:ContactsContext:ConnectionString"])); After: services .AddDbContext<ContactsContext>(options => { options.UseSqlServer(Configuration["Data:ContactsContext:ConnectionString"]); options.EnableSensitiveDataLogging(); });

Теперь, запустив тот же запрос, что и выше, вы увидите следующий результат.

Microsoft.EntityFrameworkCore.Database.Command[20100] Executing DbCommand [Parameters=[@__id_0='1' (Nullable = true)], CommandType='Text', CommandTimeout='30'] SELECT TOP(2) [m].[Id], [m].[Address], [m].[City], [m].[Email], [m].[Name], [m].[Phone], [m].[PostalCode], [m].[State] FROM [Contact] AS [m] WHERE [m].[Id] = @__id_0

Как видите, включив регистрацию конфиденциальных данных, мы получим значение параметра ID вместо вопросительного знака.

Before: [Parameters=[@__id_0='?' (DbType = Int32)] After: [Parameters=[@__id_0='1' (DbType = Int32)]

Заключение

Это удобный вариант, когда он вам нужен. Просто используйте его с осторожностью, так как он может раскрыть данные, которые должны оставаться конфиденциальными.

Первоначально опубликовано на сайте elanderson.net 10 марта 2019 г.