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

时间:2015-02-22 01:08:52

标签: c# entity-framework signalr

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

I had the same problem using Effort.EF6, but updating NMemory (as user326608 suggested) didn't help. Turns out XUnit is executing tests in parallel by default since V2.

Disabling this behavior fixed it for me. Add the following to AssemblyInfo.cs:

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

Although I see this as a workaround, as unit tests should be independent from each other.

答案 3 :(得分:0)

请注意不要在其他线程中使用DbContext,而只能在UI线程中使用它。
如果您需要从其他线程调用包含DbContext的函数, 您需要通过SynchronizationContext类来调用它。

我认为每个线程UI和其他线程UI不能同时使用DbContext。