我在MVC Web应用程序中使用 Entity Framework 6 ,我目前正在SaveChanges
块中包含对try..catch
方法的所有调用。 每当发现异常时,异常详细信息都会记录到文件中,并且也会通过电子邮件发送到特定的电子邮件地址。
现在,我还希望日志条目和电子邮件包含导致SaveChanges
抛出异常的实际SQL查询。我知道有时甚至在生成和执行SQL Query之前也会抛出异常,我只需要在由于SQL Server执行Query时发生异常而导致异常的情况。
我知道有几种方法可以记录正在执行的SQL查询。
DbContext.Database.Log Property
using (var context = new BlogContext())
{
context.Database.Log = Console.Write;
}
Registering interceptors 和 ObjectQuery.ToTraceString Method
我可以使用上述任何方法记录所有SQL查询,但我不确定如何识别导致错误的SQL?
我正在考虑使用Database.Log
方法使用一些会话变量跟踪每个请求的最新执行查询(我的DbContext实例是Per Request Scoped)并且假设最新执行的查询会话变量是发生异常的罪魁祸首。这在所有情况下都不起作用,因为它可能并不总是最新执行的查询导致异常,由于验证失败或其他原因,EF可能抛出异常(在这种情况下我不需要任何SQL记录)。
有没有什么方法可以确定导致SaveChanges上的异常的查询?使用任何提到的日志记录方法与其他一些属性结合使用还是完全不同的方法?