Подтвердить что ты не робот

Multi-async в Entity Framework 6?

Это мой код:

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

Но когда я вызвал функцию из контроллера. Он показал ошибку

Вторая операция началась в этом контексте до завершения предыдущей асинхронной операции. Используйте "ждут", чтобы убедиться, что какие-либо асинхронные операции были выполнены до вызова другого метода в этом контексте. Любые члены экземпляра не гарантируют безопасность потоков.

Пожалуйста, помогите мне решить эту проблему.

4b9b3361

Ответ 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>();