Мульти-асинхронность в Entity Framework 6?


Это мой код:

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

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

вторая операция, начатая в этом контексте до завершения предыдущей асинхронной операции. Используйте 'await', чтобы убедиться, что все асинхронные операции завершены перед вызовом другого метода в этом контексте. Члены экземпляров не гарантируется потокобезопасность.

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

3 73

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>();