实体框架“意外连接状态”例外

问题描述 投票:17回答:3

经过三个小时的调试和搜索,我希望有人在这里有答案。如果我连续快速调用以下函数(例如,相隔<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()电话。有任何想法吗?

c# entity-framework signalr
3个回答
4
投票

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

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


1
投票

我和Effort.EF6 1.3.0有这个问题。对我来说,修复是将NMemory依赖关系从1.1.0更新为1.1.2。


0
投票

我使用Effort.EF6有同样的问题,但更新NMemory(如user326608建议)没有帮助。原来XUnit is executing tests in parallel by default since V2

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

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

虽然我认为这是一种解决方法,因为单元测试应该彼此独立。

© www.soinside.com 2019 - 2024. All rights reserved.