Entity Framework Core: Une deuxième opération a commencé ce contexte, avant une précédente opération s'est terminée
Je suis en train de travailler sur un ASP.Net Core 2.0 projet à l'aide de Entity Framework Core
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0"/>
Et dans un de mes liste de méthodes que j'obtiens cette erreur:
InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.
Microsoft.EntityFrameworkCore.Internal.ConcurrencyDetector.EnterCriticalSection()
C'est ma méthode:
[HttpGet("{currentPage}/{pageSize}/")]
[HttpGet("{currentPage}/{pageSize}/{search}")]
public ListResponseVM<ClientVM> GetClients([FromRoute] int currentPage, int pageSize, string search)
{
var resp = new ListResponseVM<ClientVM>();
var items = _context.Clients
.Include(i => i.Contacts)
.Include(i => i.Addresses)
.Include("ClientObjectives.Objective")
.Include(i => i.Urls)
.Include(i => i.Users)
.Where(p => string.IsNullOrEmpty(search) || p.CompanyName.Contains(search))
.OrderBy(p => p.CompanyName)
.ToPagedList(pageSize, currentPage);
resp.NumberOfPages = items.TotalPage;
foreach (var item in items)
{
var client = _mapper.Map<ClientVM>(item);
client.Addresses = new List<AddressVM>();
foreach (var addr in item.Addresses)
{
var address = _mapper.Map<AddressVM>(addr);
address.CountryCode = addr.CountryId;
client.Addresses.Add(address);
}
client.Contacts = item.Contacts.Select(p => _mapper.Map<ContactVM>(p)).ToList();
client.Urls = item.Urls.Select(p => _mapper.Map<ClientUrlVM>(p)).ToList();
client.Objectives = item.Objectives.Select(p => _mapper.Map<ObjectiveVM>(p)).ToList();
resp.Items.Add(client);
}
return resp;
}
Je suis un peu perdu, surtout parce qu'elle fonctionne quand je le lance en local, mais quand je déployer pour ma mise en scène server (IIS 8.5) il me met cette erreur et il fonctionnait normalement. L'erreur a commencé à apparaître après que je l'augmentation de la longueur max d'un de mes modèles. J'ai aussi mis à jour la longueur maximum de la Vue correspondante Modèle. Et il existe de nombreuses autres méthodes qui sont très semblables et qu'ils sont au travail.
J'ai eu un Hangfire travail en cours d'exécution, mais ce travail n'a pas la même entité. C'est tout ce que je peux penser pour être pertinent. Toutes les idées de ce qui pourrait être la cause?
- Vérifier this.
- J'ai vu cela et bien d'autres questions similaires et de les essayé. Ma méthode a été async et j'ai fait de la synchronisation d'éviter ces problèmes. J'essaie aussi de supprimer le mappage, a également essayé de supprimer le .ToPagedList il continue à jeter de l'erreur.
- Serait bon de voir une trace de la pile
- Et pour savoir si plusieurs résultats sont activés
Vous devez vous connecter pour publier un commentaire.
L'exception signifie que
_context
est utilisé par les deux fils en même temps; les deux fils dans la même demande, ou par les deux demandes.Est votre
_context
déclaré statique peut-être? Il ne devrait pas être.Ou faites-vous appel à
GetClients
plusieurs fois dans la même demande à partir de quelque part d'autre dans votre code?Vous avez peut-être déjà fait, mais idéalement, vous seriez à l'aide de l'injection de dépendance pour votre
DbContext
, ce qui signifie que vous serez en utilisantAddDbContext()
dans votre Démarrage.cs, et votre contrôleur constructeur va ressembler à quelque chose comme ceci:Si votre code n'est pas comme cela, nous montrer et peut-être nous pouvons vous aider davantage.
Je ne suis pas sûr si vous utilisez du Cio et de l'Injection de Dépendance pour résoudre votre DbContext où il pourrait être utilisé. Si vous le faites et que vous utilisez natif du Cio de .NET de Base (ou de tout autre Cio-Conteneur) et vous obtenez cette erreur, assurez-vous d'enregistrer votre DbContext Transitoire. Ne
OU
au lieu de
AddDbContext ajoute le contexte comme l'étendue, qui pourraient causer des problèmes lorsque vous travaillez avec plusieurs threads.
Aussi async /await opérations peut provoquer ce comportement, lors de l'utilisation asynchrone des expressions lambda.
L'ajouter en tant que passagère a aussi ses inconvénients. Vous ne serez pas en mesure d'apporter des modifications à certains entité sur plusieurs classes à l'aide du contexte, parce que chaque classe aura son propre instance de votre DbContext.
Task.Run(async () => context.Set...)
sans attente ou la création d'une portée db contexte sans attendre le résultat. Cela signifie que votre contexte est probablement déjà éliminés lors de l'accès à elle. Si vous êtes sur Microsoft DI, vous devez créer une dépendance étendue à l'intérieur de vous-même queTask.Run
. Découvrez ces liens. stackoverflow.com/questions/45047877/... docs.microsoft.com/en-us/dotnet/api/...Cette erreur, dans certains cas, causé par ce scénario: vous appelez un async méthode, mais n'a pas utilisé attendent avant d'appeler la méthode. mon problème a été résolu par l'ajout d'attendre avant de la méthode. cependant, la réponse pourrait ne pas être liée à la question, mais il peut aider à une erreur semblable.
First()
àawait / FirstAsync()
travaillé.J'ai fait face à la même question, mais la raison en était aucun de ceux énumérés ci-dessus. J'ai créé un groupe, créé une portée à l'intérieur de la tâche et a demandé le récipient pour obtenir un service. Qui a bien fonctionné mais ensuite, j'ai utilisé un second service à l'intérieur de la tâche et j'ai oublié aussi de la demande pour le nouveau champ d'application. De ce fait, le 2ème service a l'aide d'un DbContext qui a déjà été éliminés.
Je l'ai fait ceci:
J'ai eu le même message d'erreur. C'est arrivé parce que j'ai appelé une méthode qui a été construit comme
public async void ...
au lieu depublic async Task ...
.J'ai eu le même message. Mais il ne fait pas sens dans mon cas. Mon problème est que j'ai utilisé un "NotMapped de la propriété" par erreur.
C'est probablement seulement une erreur de syntaxe Linq ou d'un modèle de classe dans certains cas. Le message d'erreur semble induire en erreur. Le sens original de ce message est de vous ne pouvez pas appel asynchrone sur la même dbcontext plus d'une fois pour la même demande.
Vous pouvez consulter ce lien pour plus de détails,
https://www.softwareblogs.com/Posts/Details/5/error-a-second-operation-started-on-this-context-before-a-previous-operation-completed
J'ai un service d'arrière-plan qui effectue une action pour chaque entrée dans une table. Le problème, c'est que si je parcourir et de modifier certaines données de tous sur la même instance de la DbContext cette erreur se produit.
Une solution, comme mentionné dans ce fil de discussion est de changer le DbContext de la durée de vie de façon transitoire en le définissant comme
mais parce que je ne les modifications dans plusieurs services différents et de les valider à la fois à l'aide de la
SaveChanges()
méthode cette solution ne fonctionne pas dans mon cas.Parce que mon code s'exécute dans un service, je faisais quelque chose comme
pour être en mesure d'utiliser le service comme si c'était une simple demande. Donc pour résoudre le problème je viens de diviser le seul champ d'application en deux, l'un pour la requête et l'autre pour les opérations d'écriture comme:
Comme ça, il y a effevtively deux instances différentes de la DbContext utilisé.
Une autre solution possible serait de faire en sorte que l'opération de lecture a pris fin avant le démarrage de l'itération. Ce n'est pas très pratique dans mon cas, car il pourrait y avoir un grand nombre de résultats qui devraient toutes être chargé en mémoire pour l'opération que j'ai essayé de l'éviter en utilisant un Interrogeable en premier lieu.
J'ai eu un problème similaire.
J'ai résolu le mien par la modification de l'utilisation de
foreach
boucle, à l'aide defor
boucle.Je pense que cette réponse ne peut toujours aider quelqu'un et d'économiser beaucoup de temps. J'ai résolu un problème similaire en changeant
IQueryable
àList
(ou au tableau, la collection...).Par exemple:
à
J'ai eu le même problème lorsque j'essaie d'utiliser
FirstOrDefaultAsync()
dans la méthode asynchrone dans le code ci-dessous. Et quand je fixeFirstOrDefault()
- le problème a été résolu!J'ai juste réussi à le faire fonctionner à nouveau. Il ne fait pas beaucoup de sens, mais il a travaillé:
Je vais étudier plus plus tard, mais la méthode que j'ai appelé avec hangfire reçoit un DBContext et qui est la cause possible.