web-dev-qa-db-fra.com

Multi-async dans Entity Framework 6?

Ceci est mon code:

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

Mais quand j'ai appelé la fonction du contrôleur. Il a montré une erreur

Une seconde opération a démarré dans ce contexte avant la fin d'une précédente opération asynchrone. Utilisez 'wait' pour vous assurer que toutes les opérations asynchrones sont terminées avant d'appeler une autre méthode sur ce contexte. Il n'est pas garanti que les membres d'instance soient thread-safe.

S'il vous plaît aidez-moi à résoudre ce problème.

84
An Hv

L'exception explique clairement qu'il n'y a qu'une seule opération asynchrone par contexte autorisée à la fois.

Donc, vous devez soit await les un à la fois, comme le message d'erreur le suggère:

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

Ou vous pouvez utiliser plusieurs contextes:

var banner = context1.Banners.ToListAsync();
var newsGroup = context2.NewsGroups.ToListAsync();
await Task.WhenAll(banner, newsGroup);
114
Stephen Cleary

Si vous utilisez un conteneur IoC pour votre injection de fournisseur de données, envisagez d'utiliser le type "transitoire" ou "PerWebRequest" pour votre cycle de vie.

Par exemple: https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md

4
Teoman shipahi

Si vous utilisez Unity pour l'injection de dépendance avec, par exemple, un modèle de référentiel, vous obtiendrez l'erreur suivante en utilisant deux contextes ou plus avec create/update/delete:

La relation entre les deux objets ne peut pas être définie car ils sont attachés à différents objets ObjectContext.

Ceci peut être résolu en utilisant PerRequestLifetimeManager. Plus d'infos ici:

C # EF6 effectue plusieurs appels asynchrones vers un contexte en utilisant Unity - Asp.Net Web Api

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