EF Core 中 SQL 跟踪时丢失参数值

30
我已经按照这篇文章实现了从 EF Core 追踪 SQL 查询的方法:https://learn.microsoft.com/en-us/ef/core/miscellaneous/logging。但是在追踪查询参数时遇到了问题。当我接收到日志事件时,在所有的 DbParameterLogData 的值中,我只看到问号而不是我传递给查询的实际值。enter image description here 我正在使用 VS 2015。

看起来非常像值字符串"?"。你是如何构建查询的? - Marc Gravell
不,例如来自其他上下文但具有相同结果的查询:“IQueryable<Agreement> query = _agreements.Where(a => a.AgreementNumber == filter.AgreementNumber);” 我确信,filter.AgreementNumber的值与“?”不同。 - asat
1个回答

63

这是 EF Core 的默认行为 (用 DbParameterLogData.Value 属性填充 "?")。

为了获取真正的参数值,您需要通过使用 DbContextOptionsBuilder.EnableSensitiveDataLogging 方法启用 敏感数据记录

启用应用程序数据包括在异常消息、日志等中。这可能包括分配给实体实例属性的值,发送到数据库的命令的参数值和其他此类数据。只有在根据此数据的敏感性设置了适当的安全措施时,才应启用此标志。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.EnableSensitiveDataLogging();
    // ...
}

10
有时会导致MissingMethodException,应在ConfigureServices()中调用它:services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")).EnableSensitiveDataLogging()) - user1289580
一个小的调试技巧。 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); if (Debugger.IsAttached) { optionsBuilder.EnableSensitiveDataLogging(); } } - granadaCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接