The following code generates a -not dev-friendly- error
builder.Entity<MyEntity>(b =>
{
b.HasKey(e => e.Guid);
b.ToTable("NotExistingTable");
});
public DbSet<MyEntity> MyTable { get; set; }
DbContext.MyTable.Add(new MyEntity(){SomeField="test"});
await DbContext.SaveChangesAsync();
The error:
Message:
Object reference not set to an instance of an object.
at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.System.IObserver<System.Collections.Generic.KeyValuePair<System.String,System.Object>>.OnNext(KeyValuePair`2 keyValuePair)
at System.Diagnostics.DiagnosticListener.Write(String name, Object value)
at Microsoft.EntityFrameworkCore.Internal.CoreLoggerExtensions.SaveChangesFailed(IDiagnosticsLogger`1 diagnostics, DbContext context, Exception exception)
at Microsoft.EntityFrameworkCore.DbContext.<SaveChangesAsync>d__48.MoveNext()
It would be nice to have something saying that the table could not be found or something like this :)
@JeanCollas I'm unable to repro this so far. Can you confirm that you are using the 2.0 version of all packages, including Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.
I get this error with Pomelo.EntityFrameworkCore.MySql provider
When i call savechanges. Very confusing error, can't understand what it is. The table exists.
Object reference not set to an instance of an object.
at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.System.IObserver<System.Collections.Generic.KeyValuePair<System.String,System.Object>>.OnNext(KeyValuePair`2 keyValuePair) at System.Diagnostics.DiagnosticListener.Write(String name, Object value) at Microsoft.EntityFrameworkCore.Internal.CoreLoggerExtensions.SaveChangesFailed(IDiagnosticsLogger`1 diagnostics, DbContext context, Exception exception) at Microsoft.EntityFrameworkCore.DbContext.<SaveChangesAsync>d__48.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
I see that issue during integration testing my ASP Net app. Multiple TestServers are created and disposed and later tests are executed that don't rely on these TestServers. But seem to be affected somehow by them.
For example this test is fine when it is executed without prior creation of the TestServers.
[Fact]
public void CreateEmptyCalendar() {
using (var context = TestUtils.GetContext()) {
context.Calendars.Add(new Calendar());
Assert.Throws<DbUpdateException>(() => context.SaveChanges());
}
}
But if fails with a System.NullReferenceException in DatabaseErrorPageMiddleware.OnNext(KeyValuePair<string, object> keyValuePair) when the integration tests where run previously. GetContext() simply creates a new DbContext using an SqliteConnection.
The exception goes away if I don't call app.UseDatabaseErrorPage(); in my Startup class.
I'll see if I can come up with a small test case.
I'm seeing this as well. It seems like if anything throws an exception inside SaveChanges(Async) this happens. I've disabled Just My Code in the debugger and am able to see the real exception before it gets caught by the framework - in this case a SqliteException (Error 19 not null constraint failed FWIW). Similar to others here this is happening from an xUnit integration test.
What seems to happen is the SqliteException is getting caught inside the framework and then turned into a DbUpdateException which is then being caught again inside the framework. Somewhere after this we get a NullReferenceException at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.System.IObserver<System.Collections.Generic.KeyValuePair<System.String,System.Object>>.OnNext(KeyValuePair2 keyValuePair)`, same as above.
I'm out of time right now so I can't investigate further but hopefully this is a step in the right direction.
Ok so apparently what is happening is _localDiagnostic.Value is getting set to null somewhere between the time it's being set in DatabaseErrorPageMiddleware.Invoke(HttpContext) at DatabaseErrorPageMiddleware.cs:103 and when it is used in DatabaseErrorPageMiddleware.OnNext(KeyValuePair<string, object>) at DatabaseErrorPageMiddleware.cs:223 . I'm not really sure why and I can't seem to track down where it is being set to null. Perhaps there is a problem with AsyncLocal?
Hopefully this helps track it down and get the problem fixed.
@anpete Can you bump up the priority of investigating this, also considering https://github.com/aspnet/Home/issues/2820
@ajcvickers Will do.
I just saw this problem in EF Core 2.0.3 (included via Microsoft.AspNetCore.All 2.0.8). In my attempt to build a minimal test case, the problem disappeared and gave way to a much more helpful exception, which explained that a TimeSpan of 4 days is too big for a column in SqlServer.
Using Dot Net Core 2.0 framework and EFCore 2.0.3 I have this error but I am not calling SaveChagnes(). However it happens when calling below query:
return await query.Take(100).ToListAsync();
query is an IQueryable object from my dbset.
I cannot reproduce it but it happens often.
Here is the stack trace:
System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.System.IObserver<System.Collections.Generic.KeyValuePair<System.String,System.Object>>.OnNext(KeyValuePair`2 keyValuePair)
at System.Diagnostics.DiagnosticListener.Write(String name, Object value)
at Microsoft.EntityFrameworkCore.Internal.CoreLoggerExtensions.QueryIterationFailed(IDiagnosticsLogger`1 diagnostics, Type contextType, Exception exception)
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.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Linq.AsyncEnumerable.<Aggregate_>d__6`3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at RubyVAS.Controllers.BackgroundRenewal.<GetSubscriptions>d__5.MoveNext() in C:\Users\xxx\Source\Repos\xxx\xxx\Controllers\RenewalController.cs:line 421
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at RubyVAS.Controllers.BackgroundRenewal.<Roshan>d__4.MoveNext() in C:\Users\xxx\Source\Repos\xxx\xxx\Controllers\RenewalController.cs:line 344
@mustafashujaie - This issue has been fixed in 2.1 release. Which version of packages are you using? Fix is in Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore package.
This is the .csproj file:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<UserSecretsId>aspnet-RubyVAS-7B5F8BD4-0125-4090-BA45-4785CF064F2A</UserSecretsId>
<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Core.Flash" Version="1.0.0" />
<PackageReference Include="DotnetCOre.NPOI" Version="1.0.2" />
<PackageReference Include="Hangfire" Version="1.6.19" />
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.6" />
<PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.6" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.8" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.3" PrivateAssets="All" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.4" PrivateAssets="All" />
<PackageReference Include="RabbitMQ.Client" Version="5.0.1" />
<PackageReference Include="X.PagedList.Mvc.Core" Version="7.2.4" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
</ItemGroup>
</Project>
@mustafashujaie - You are using 2.0.8 version of AspnetCore.All. Please upgrade all AspNet related packages to 2.1 release in order to get the bug fix. Read this for more info on how to upgrade. https://docs.microsoft.com/en-us/aspnet/core/migration/20_21?view=aspnetcore-2.1
Most helpful comment
@mustafashujaie - You are using 2.0.8 version of AspnetCore.All. Please upgrade all AspNet related packages to 2.1 release in order to get the bug fix. Read this for more info on how to upgrade. https://docs.microsoft.com/en-us/aspnet/core/migration/20_21?view=aspnetcore-2.1