实体框架6中的多异步?

时间:2013-12-17 07:57:07

标签: entity-framework asynchronous entity-framework-6

这是我的代码:

var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);

但是当我从控制器调用该函数时。它显示错误

  

在上一次异步操作完成之前,在此上下文中启动了第二个操作。使用'等待'确保在调用此上下文中的另一个方法之前已完成任何异步操作。不保证任何实例成员都是线程安全的。

请帮我解决这个问题。

3 个答案:

答案 0 :(得分:112)

该异常清楚地解释了每次只允许一个异步操作。

因此,您需要一次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);

答案 1 :(得分:4)

如果您使用IoC容器进行数据提供者注入,请考虑使用" transient"或者" PerWebRequest"输入你的生命周期。

例如:https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md

答案 2 :(得分:2)

如果使用Unity进行依赖注入,例如存储库模式,则使用create / update / delete两个或多个上下文会出现以下错误:

  

无法定义两个对象之间的关系,因为   它们附加到不同的ObjectContext对象。

这可以使用PerRequestLifetimeManager来解决。更多信息:

C# EF6 make multiple async calls to one context using Unity - Asp.Net Web Api

container.RegisterType<DbContext>(new PerRequestLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>();
container.RegisterType<IContactRepository, ContactRepository>();