C# 实体框架-如何避免命令不同步异常

C# 实体框架-如何避免命令不同步异常,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我使用实体框架(DbContext)、UnitOfWork和存储库模式编写了一个小应用程序。下面的代码 using (IUnitOfWork testUow = uowFactory.CreateUnitOfWork()) { foreach (Transponder transp in testUow.Transponders.GetAll()) // outer sql { var query = testUow.Animals.GetAll()

我使用实体框架(
DbContext
)、UnitOfWork和存储库模式编写了一个小应用程序。下面的代码

using (IUnitOfWork testUow = uowFactory.CreateUnitOfWork())
{
    foreach (Transponder transp in testUow.Transponders.GetAll()) // outer sql
    {
        var query = testUow.Animals.GetAll()
                    .Where(anim => anim.TransponderId == transp.Id); // inner sql

        // next line throws EntityCommandException: 
        Animal test = query.Single(); 
    }
}
产生一个

EntityCommandException:{“命令不同步;现在无法运行此命令”}

转发器
动物
是我的存储库

为什么会出现此异常?

让代码生成嵌套的sql命令,比如我的示例(在代码示例中标记为内部sql和外部sql),这不是很好吗

如何更改代码/设计以避免此异常?

我知道我可以重写linq查询,因此它是一个单行程序,但我对更通用的解决方案感兴趣。

MySql(连接器)不支持多个活动结果集(MARS)。因此,在执行外部查询(循环迭代时运行)时,它无法通过同一连接读取其他结果集


因此,正如您所说,重写查询是解决方案。不管怎么说,它更好,因为这里有一个1+N的问题。

所以设计本身是正确的,我只是要避开火星?但是,如果我的工作单元有很长的生命周期(比如与视图模型共享生命周期),那么在同一个连接上会有很多查询。那么我怎样才能避开火星呢?你能解释一下什么是1+N问题吗?谢谢你的帮助!N+1是反模式,其中1个查询触发N个查询以获取相关对象,而联接可以在一个查询中获取所有对象。人们通常称之为N+1,而不是1+N,实际上不知道为什么。至于MARS问题,我认为应该避免延迟加载,因为这会在读取所属对象时触发查询。但总的来说,缩短上下文的使用寿命是个好主意。