c# - 为什么entity framework+mysql provider枚举返回部分结果无一异常(exception)

标签 c# .net mysql entity-framework

我试图理解我在 .net 3.5 sp1 + MySQL 6.1.2.0 上使用 Entity Framework 作为提供者的情况。它涉及以下代码:

Response.Write("Products: " + plist.Count() + "<br />");
var total = 0;
foreach (var p in plist)
{
//... some actions
    total++;
//... other actions
}
Response.Write("Total Products Checked: " + total + "<br />");

基本上每次运行的产品总数都不同,并且与 plist 中的完整总数不匹配。它变化很大,从大约 1/5 到一半。

foreach 中没有任何控制流代码,即没有 break、continue、try/catch、total++ 周围的条件,以及任何可能影响计数的内容。作为确认,在与操作相关的循环中捕获了其他总计,并且这些总计与较低和较高的总运行相匹配。

除了 Entity Framework 或 mysql 提供程序导致它在检索项目时结束 foreach 之外,我没有找到上述任何原因。

foreach 的主体可以在时间上有一些很好的变化,因为操作涉及文件和网络访问,我当时最好的办法是当 .net 代码超过特定阈值时,会有某种类型的底层框架/提供程序超时,它不会导致异常,而是默默地报告没有更多的项目用于枚举

任何人都可以在上述情况下给出一些说明和/或确认 Entity Framework /mysql 提供程序是否具有上述行为?


更新 1: 我无法通过在测试项目的简单 foreach 中使用 Thread.Sleep 来重现该行为,我不确定还能在哪里寻找这种奇怪的行为:(。


更新 2:在上面的示例中,.Count() 始终返回相同且正确的项目数量。按照建议使用 ToList 或 ToArray 可以按预期解决问题(foreach 主体中没有流控制语句)并且两个计数匹配 + 在每次运行时都不会变化。

我感兴趣的是在 Entity Framework + mysql 中导致这种行为的原因。真的不希望在枚举结果之前不必更改所有使用 Entity Framework + mysql 来执行 .ToArray 的项目中的代码,因为我不知道它什么时候会吞下一些结果。或者如果我这样做,至少知道它发生了什么/为什么发生。

最佳答案

如果问题与提供者或其他相关,那么您可以在迭代之前通过实现可枚举来解决/识别该问题:

var realisedList = plist.ToArray();
foreach(var p in realisedList)
{
  //as per your example
}

如果这样做之后,问题仍然存在,那么

a) 枚举器中的一个操作导致异常被某处吞没

b) 底层数据确实每次都不同。

更新:(根据您的评论)

[已删除 - 根据您的评论进行多项枚举]

在一天结束时 - 我将调用 ToArray() 来解决这种情况下的问题(如果需要 Count() 方法来获取总数,则只需将其更改为 .Length 在构造的数组上)。

也许 MySql 在您枚举时正在终止连接,并且在调用下一个 MoveNext() 时不会向 EF 抛出错误。然后 EF 尽职尽责地回应说可枚举已完成。如果是这样,在修复提供程序中的此类错误之前,ToArray() 是前进的方向。

关于c# - 为什么entity framework+mysql provider枚举返回部分结果无一异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2777522/

相关文章:

c# - 当线程获得未处理的异常时 CLR 退出

mysql - 连接 4 个表中的数据来计算多个加权分数

c# - 在 ASP.NET MVC(5) 项目中使用 Web API 有什么优势?

c# - C#列表迭代性能

c# - 选择 ListView 项时填充文本框

c# - 从字符串位转换为字节或十六进制

mysql - 导入大型 SQL 文件

mysql:恢复管理员用户的所有权限

c# - 获取 List<T> 中最小值索引的快速/有效方法?

C# 任务 - 链接取消 token 不起作用