1

Je reçois cette erreur de mon application Web hébergée dans Azure. Il fonctionne bien pendant quelques jours et s'arrête soudainement de fonctionner.EF Core: Une exception s'est produite dans la base de données lors de l'itération des résultats d'une requête

Y a-t-il un problème avec la connexion? Quelle référence d'objet n'a pas d'instance?

YYYY-MM-DD hh:mm:ss [Error] An exception occurred in the database while iterating the results of a query. 
System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable.AsyncEnumerator.<BufferAllAsync>d__12.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at Microsoft.EntityFrameworkCore.Query.RelationalQueryContext.<RegisterValueBufferCursorAsync>d__14.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable.AsyncEnumerator.<BufferlessMoveNext>d__9.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable.AsyncEnumerator.<MoveNext>d__8.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable`2.SelectAsyncEnumerator.<MoveNext>d__4.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.<_FirstOrDefault>d__82`1.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Microsoft.EntityFrameworkCore.Query.Internal.TaskResultAsyncEnumerable`1.Enumerator.<MoveNext>d__3.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable`2.SelectAsyncEnumerator.<MoveNext>d__4.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.<MoveNext>d__5.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at MyProject.Data.SectionRepository.<GetByTypePathAndAlias>d__6.MoveNext() in /Users/webaccount/myproject/src/MyProject.Data/Repositories/SectionRepository.cs:line 34 

Il n'y a rien de spécial dans mon référentiel ou code d'entité.

public async Task<Section> GetByTypeId(string typeId) 
{ 
    var sections = from s in this.DbContext.Sections 
     where s.TypeId == typeId 
     select s; 

    return await sections.FirstOrDefaultAsync(); // <-- LINE 34 
} 

Ceci est mon entité.

public class Section 
{ 
     [Key] 
     public int Id { get; set; } 
     public DateTimeOffset CreatedDate { get; set; } 
     public string TypeId { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
} 

Est-ce lié à cela peut-être? https://github.com/aspnet/EntityFrameworkCore/issues/8026

Est-ce que ça va être utile si je convertis mes méthodes de dépôt en synchronisation et reste asynchrone au contrôleur?

+1

Pouvez-vous fournir votre chaîne de connexion? Peut-être que vous devez ajouter "MultipleActiveResultSets = true" dedans – hugoterelle

+0

Il est faux. Je vais le mettre à vrai et essayer. Merci. –

+0

Après l'avoir défini sur True et l'avoir laissé s'exécuter, cela fonctionne à nouveau. Dans quelques jours, je reçois maintenant une autre erreur: "La connexion ne prend pas en charge MultipleActiveResultSets." Je ne sais pas pourquoi je reçois ça quand ça a marché plusieurs fois. –

Répondre

0

It runs ok for a few days and then suddenly stops working.

Object reference not set to an instance of an object

Tout d'abord, vous pouvez essayer de remote debug your web app et vérifier le this.DbContext.

Deuxièmement, vous pouvez créer/utiliser une instance de contexte par requête, et this artciel shows some general guidelines when deciding on the lifetime of the context, vous pouvez le vérifier.

+0

Je vais essayer de mettre MARS à true comme suggéré par hugorgor. Je ne peux pas faire une instance par requête car je voudrais que le DbContext soit injecté. Est-il possible de faire par demande mais toujours injecté à partir de quelque part à l'extérieur du référentiel? –

+0

Il semble que vous utilisiez le framework d'injection de dépendances, essayez d'utiliser un conteneur DI pour injecter des instances DbContext avec une durée de vie PerWebRequest. –

+0

La durée de vie par défaut n'est-elle pas transitoire? C'est équivalent à la demande par web, je pense. –