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问题,我认为应该避免延迟加载,因为这会在读取所属对象时触发查询。但总的来说,缩短上下文的使用寿命是个好主意。