Multi-async в Entity Framework 6?
Это мой код:
var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
Но когда я вызвал функцию из контроллера. Он показал ошибку
Вторая операция началась в этом контексте до завершения предыдущей асинхронной операции. Используйте "ждут", чтобы убедиться, что какие-либо асинхронные операции были выполнены до вызова другого метода в этом контексте. Любые члены экземпляра не гарантируют безопасность потоков.
Пожалуйста, помогите мне решить эту проблему.
Ответы
Ответ 1
Исключение объясняет, что существует только одна асинхронная операция за каждый разрешенный контекст.
Таким образом, вы либо должны 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);
Ответ 2
Если вы используете контейнер IoC для инъекции поставщика данных, подумайте о том, чтобы использовать для вашего жизненного цикла тип "переходный" или "PerWebRequest".
Например: https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md
Ответ 3
Если вы используете Unity для инъекции зависимостей с примером шаблона репозитория, вы получите следующую ошибку, используя два или более контекста с create/update/delete:
Связь между двумя объектами не может быть определена, потому что они привязаны к различным объектам ObjectContext.
Это можно решить, используя PerRequestLifetimeManager
. Подробнее здесь:
С# EF6 сделать несколько асинхронных вызовов в одном контексте с помощью Unity - Asp.Net Web Api
container.RegisterType<DbContext>(new PerRequestLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>();
container.RegisterType<IContactRepository, ContactRepository>();