entity framework“意外连接状态”例外

经过三个小时的调试和搜索,我希望有人在这里有答案。 如果我连续快速调用以下函数(例如,相隔<0.1秒),实体框架(使用MySQL)会抛出以下异常。

System.InvalidOperationException:意外的连接状态。 使用包装提供程序时,请确保在包装的DbConnection上实现StateChange事件。

但是,有时function没有任何问题。 在第一个ToList()调用上抛出exception:

 void InsertOrUpdateMaterials(List materials) { var id = GetUserId(); var materialIds = materials.Select(x => x.MaterialId).ToList(); // Remove old materials from DB var oldMaterials = Db.Materials.Where(p => p.CreatedBy == id && materialIds.Contains(p.MaterialId)).ToList(); // exception Db.Materials.RemoveRange(oldMaterials); Db.SaveChanges(); // Replace previous materials with the new ones in list Db.Materials.AddRange(materials); Db.SaveChanges(); } 

奇怪的是,这个错误从未发生在开发服务器上,所以我调查了可能的配置问题无济于事。

有时,Entity Framework会抛出:

System.Data.Entity.Core.EntityCommandExecutionException:已经有一个与此Connection关联的打开DataReader,必须先关闭它。

再次指向ToList()调用。 有任何想法吗?

对于可能存在类似问题的其他人。 根据上述注释,代码似乎使用缓存的db-context。 创建db-context之后,db-connection崩溃了(应用程序中没有安装StateChange处理程序)。 连接崩溃后,应用程序使用缓存的db-context对其执行某些操作。

创建新的db-context解决了这个问题。

我在Effort.EF6 1.3.0中遇到过这个问题。 对我来说,修复是将NMemory依赖关系从1.1.0更新到1.1.2。

我使用Effort.EF6遇到了同样的问题,但更新NMemory (如建议的user326608 )没有帮助。 事实certificate,自V2以来 , XUnit默认并行执行测试 。

禁用此行为会为我修复此问题。 将以下内容添加到AssemblyInfo.cs:

 using Xunit; [assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly)] 

虽然我认为这是一种解决方法,因为unit testing应该彼此独立。