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