1

使用 Entity Framework 和 IEnumerables 的优点之一是您不必担心何时实际从数据库中查询数据。您只需传递查询结果,当实际需要时,EF 会为您获取。但是,当涉及到在您的 SELECT 代码周围放置 try/catch 时,它就会成为一个问题,因为要准确确定何时查询数据库并不容易。

我现在遇到间歇性数据库超时,我想记录 EF 在发生这种情况时使用的 SQL,但我遇到了上面刚刚描述的问题。我有什么方便的方法来处理这个吗?还是我看错了问题?

4

3 回答 3

4

每当执行您期望的功能代码块时,您应该使用正确的 try/catch 错误处理(就像在这种情况下,每当您针对 EF 数据上下文执行 Lamba 表达式和/或 LINQ 查询时)。真正的问题是你为什么会收到超时。

我想恭敬地指出您上述陈述的一个潜在错误,它可能会为诊断和修复您的超时提供一些帮助。“......您不必担心何时实际从数据库中查询数据。” 我建议在构建名义上复杂的 LINQ 查询的过程中,您实际上确实需要非常清楚数据库何时会受到影响。在通过调用 ToList()、Distinct()、Count() 等将它们具体化之前,您将希望尽可能长时间地将 LINQ 查询保持为 IQueryable。

因此,假设您正在查询一个百万行的表并且您正在通过潜在标准进行解析,您应该等到最后使用 ToList() 实现查询,因为这是 EF 生成的 SQL 语句将在数据库上执行:

using(var context = CreateEFContextFactory())
{
   var x = (from d in context.MyBigTable select d);
   if(!string.IsNullOrWhitespace(stringParam1))
      x = (from d in x where x.Field1 == stringParam1 select d);
   if(intParam2 > 0)
      x = (from d in x where x.Field2 == intParam2 select d);

   var listOfMyBigTableObjects = x.Distinct().ToList();  //point of sql execution
}
于 2012-10-05T20:41:54.563 回答
1

听起来您在这里尝试做几件事:查看由 Entity Framework 生成的 SQL,并添加一个全局错误处理程序

如果您正在编写 .NET Web 应用程序或 api,则可以添加默认错误处理程序,例如elmah。如果您使用的是 MVC,则全局错误处理程序的答案演示了将 elmah 设置为全局处理程序,但您可以轻松地自定义该示例,以使用您自己的日志记录实用程序。

于 2012-10-05T21:31:57.227 回答
1

你有点知道查询什么时候会被执行,例如.ToList(), .FirstOrDefault(),.Any()等等。所以你应该把你的try catch块放在它们周围。

于 2012-10-05T20:22:41.383 回答