Entity framework 实体框架6中的多异步?
这是我的代码:Entity framework 实体框架6中的多异步?,entity-framework,asynchronous,entity-framework-6,Entity Framework,Asynchronous,Entity Framework 6,这是我的代码: var banner = context.Banners.ToListAsync() var newsGroup = context.NewsGroups.ToListAsync() await Task.WhenAll(banner, newsGroup); 但当我从控制器调用函数时。它显示出错误 在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在此上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全 请帮助我解决此问题。
var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
但当我从控制器调用函数时。它显示出错误
在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在此上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全
请帮助我解决此问题。异常清楚地解释了每个上下文一次只允许一个异步操作 因此,您必须
一次等待一个,正如错误消息所示:
var banner = await context.Banners.ToListAsync();
var newsGroup = await context.NewsGroups.ToListAsync();
或者,您可以使用多个上下文:
var banner = context1.Banners.ToListAsync();
var newsGroup = context2.NewsGroups.ToListAsync();
await Task.WhenAll(banner, newsGroup);
如果您使用IOC容器进行数据提供程序注入,请考虑在生命周期中使用“瞬态”或“PyWebRebug”类型。
例如:如果将Unity用于依赖项注入,例如使用repository模式,则使用两个或多个上下文以及create/update/delete时会出现以下错误:
无法定义两个对象之间的关系,因为
它们附着到不同的ObjectContext对象
这可以使用PerRequestLifetimeManager
解决。更多信息请点击此处:
container.RegisterType(新的PerRequestLifetimeManager());
container.RegisterType();
container.RegisterType();
我有两项任务。如果我运行每个任务。这是成功。但是如果我按照上面的代码运行。这是一个错误只是一个注意事项,如果您有一个惰性变量在查询中使用上下文,即使使用wait,它也会抛出相同的错误,只需在查询之前获取属性,这是一个痛苦的发现。@Pedro.the.Kid:作为一般规则,不要在异步DB访问中使用惰性加载。延迟加载总是同步的,所以对附加数据使用Include或separate查询要好得多?我觉得这成了一个很大的限制因素。@Zapnologica:这就是ES6的设计方式。每个上下文一次只能处理一个查询。因此,如果在下一个查询开始之前完成一个查询,则只需要一个上下文。如果您想同时执行多个查询,这是一个问题。@StephenCleary,我很难找到该查询,因为在异常之前没有任何异常。我们有没有办法找到目前正在执行的任务?谢谢
container.RegisterType<DbContext>(new PerRequestLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>();
container.RegisterType<IContactRepository, ContactRepository>();