Еще в октябре я сделал сообщение 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 г.