经过三个小时的调试和搜索,我希望有人在这里有答案。如果我连续快速调用以下函数(例如,相隔<0.1秒),实体框架(使用MySQL)会抛出以下异常。
System.InvalidOperationException:意外的连接状态。使用包装提供程序时,请确保在包装的DbConnection上实现StateChange事件。
但是,有时功能没有任何问题。第一次ToList()
调用抛出异常:
void InsertOrUpdateMaterials(List<Material> 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
handler)。连接崩溃后,应用程序使用缓存的db-context对其执行某些操作。
创建新的db-context解决了这个问题。
我和Effort.EF6
1.3.0有这个问题。对我来说,修复是将NMemory
依赖关系从1.1.0更新为1.1.2。
我使用Effort.EF6
有同样的问题,但更新NMemory
(如user326608建议)没有帮助。原来XUnit is executing tests in parallel by default since V2。
禁用此行为会为我修复此问题。将以下内容添加到AssemblyInfo.cs:
using Xunit;
[assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly)]
虽然我认为这是一种解决方法,因为单元测试应该彼此独立。