Tengo una aplicación web ASP.NET Core 3.1 MVC, que actualicé a .NET 6 siguiendo estas instrucciones .
Todas mis pruebas unitarias están pasando.
Cuando ejecuto la aplicación, algunas consultas funcionan y otras fallan con este error:
Ocurrió un error al escribir en los registradores. (La propiedad ConnectionString no se ha inicializado).'
Tomé una de las consultas fallidas, la puse en una prueba unitaria de Sandbox y la ejecuté. Funciona bien. Entonces, hay algo mal con la inyección de dependencia de DbContext .
Intenté eliminar todas las carpetas obj y bin , reiniciar Visual Studio, reiniciar mi computadora, nada de lo cual ayudó.
Así es como estoy registrando mi DbContext :
var myConnectionString = configuration.GetConnectionString(nameof(MyDbContext)); services.AddDbContext<MyDbContext>(builder => { builder.UseSqlServer(myConnectionString); });La aplicación funcionaba bien antes de la actualización.
¿Cómo puedo solucionar esto?
System.AggregateException HResult=0x80131500 Message=An error occurred while writing to logger(s). (The ConnectionString property has not been initialized.) Source=Microsoft.Extensions.Logging StackTrace: at Microsoft.Extensions.Logging.Logger.ThrowLoggingError(List`1 exceptions) at Microsoft.Extensions.Logging.Logger.Log[TState](LogLevel logLevel, EventId eventId, TState state, Exception exception, Func`3 formatter) at Microsoft.Extensions.Logging.LoggerMessage.<>c__DisplayClass8_0.<Define>g__Log|0(ILogger logger, Exception exception) at Microsoft.Extensions.Logging.LoggerMessage.<>c__DisplayClass8_0.<Define>b__1(ILogger logger, Exception exception) at Microsoft.EntityFrameworkCore.Diagnostics.EventDefinition.Log[TLoggerCategory](IDiagnosticsLogger`1 logger, Exception exception) at Microsoft.EntityFrameworkCore.Diagnostics.CoreLoggerExtensions.RowLimitingOperationWithoutOrderByWarning(IDiagnosticsLogger`1 diagnostics) at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateTake(ShapedQueryExpression source, Expression count) at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query) at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass12_0`1.<ExecuteAsync>b__0() at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](Expression query, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetAsyncEnumerator(CancellationToken cancellationToken) at System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.GetAsyncEnumerator() at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.<ToListAsync>d__65`1.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at My.PartnerQueries.<GetIndexViewModel>d__3.MoveNext() in C:\Users\my\source\repos\my\My.Services\Partners\PartnerQueries.cs:line 21 This exception was originally thrown at this call stack: [External Code] Inner Exception 1: InvalidOperationException: The ConnectionString property has not been initialized..NET SDK 6.0.200. Visual Studio 2022 (64 bits) 17.1.0
Los detalles están todos allí en el seguimiento de la pila. El truco es saber leerlo.
Primero el Message de excepción
Message=An error occurred while writing to logger(s). (The ConnectionString property has not been initialized.)Entonces, está tratando de registrar algo en una base de datos, pero no hay una cadena de conexión. Si soluciona eso, diagnosticar futuros errores será mucho más fácil.
Pero, ¿qué llamó a .Log para desencadenar esto?
... at Microsoft.EntityFrameworkCore.Diagnostics.EventDefinition.Log[TLoggerCategory](IDiagnosticsLogger`1 logger, Exception exception) at Microsoft.EntityFrameworkCore.Diagnostics.CoreLoggerExtensions.RowLimitingOperationWithoutOrderByWarning(IDiagnosticsLogger`1 diagnostics) ...Afortunadamente, el equipo de EF Core ha escrito un método de ayuda para registrar/ignorar/lanzar varios mensajes de diagnóstico, lo que coloca el error allí mismo en el nombre del método. Una búsqueda rápida en Google del nombre del método conduce a este problema , que debería ayudar a resolver la causa raíz del problema.
Personalmente, configuraría todos los diagnósticos para incluir una compilación de depuración. Luego, a medida que comprenda lo que significa cada error, deshabilite las advertencias con las que se sienta cómodo.
.UseSqlServer(connectionString, options => { ... }) .ConfigureWarnings(w => w #if DEBUG // throw on all EF query diagnostics in debug builds (eg query should be split) .Default(WarningBehavior.Throw) #endif .Log(CoreEventId.RowLimitingOperationWithoutOrderByWarning) );