-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Description
Bug description
We have a long running hosted worker that performs batch processing operations and noticed that it leaks memory. After investigation the leak happens because entries in the compiled query cache capture change tracker data via IDiagnosticsLogger<DbLoggerCategory.Query>.
The leak shows a similar path as reported in #21016
After investigation the logs seem to be pointing to Utf8JsonReaderManager.QueryLogger being captured as a constant value in the cached expression, causing the change tracker data to end up in the query cache:
jsonReaderManager = new Utf8JsonReaderManager(
jsonReader,
[LIFTABLE Constant: DiagnosticsLogger<Query> | Resolver: c => c.Dependencies.QueryLogger]
);
A dotMemory snapshot shows how the query cache for the LeakyEntity
query retains a reference to the unrelated UnrelatedEntity
.

Attached reproduction code requires running dotnet ef migrations add InitialCreate
first. Problem was observed in production for SqlServer, but can be reproduced using Sqlite
Your code
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
await Setup();
await TriggerLeak();
// Wait for memory snapshot
Console.ReadLine();
return;
static async Task Setup()
{
await using var db = new LeakDbContext(false);
await db.Database.EnsureDeletedAsync();
await db.Database.MigrateAsync();
db.LeakyEntities.Add(new LeakyEntity { Id = 1, JsonData = new JsonData { Author = "John Doe" } });
db.UnrelatedEntities.Add(new UnrelatedEntity { Id = 1, Content = "ABC" });
db.UnrelatedEntities.Add(new UnrelatedEntity { Id = 2, Content = "123" });
await db.SaveChangesAsync();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);
}
static async Task TriggerLeak()
{
await using var db2 = new LeakDbContext(true);
// This will cache the query for the leaky entity, which contains a reference to the change tracker
var leakyEntities = await db2.LeakyEntities.ToListAsync();
// This will fetch unrelated entities which will be tracked in the change tracker and therefore leaked
var unrelatedEntities = await db2.UnrelatedEntities.ToListAsync();
// Clean up to show we are leaking
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);
}
public class LeakDbContext : DbContext
{
private readonly bool _enableLog;
public DbSet<LeakyEntity> LeakyEntities { get; set; }
public DbSet<UnrelatedEntity> UnrelatedEntities { get; set; }
public LeakDbContext() : this(false) { }
public LeakDbContext(bool enableLog) => _enableLog = enableLog;
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite($"Data Source={Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "ef-core-leak.db")}")
.LogTo(Console.WriteLine, _enableLog ? LogLevel.Trace : LogLevel.None);
protected override void OnModelCreating(ModelBuilder modelBuilder)
=> modelBuilder.Entity<LeakyEntity>().OwnsOne(p => p.JsonData, b => b.ToJson());
}
public class LeakyEntity
{
public int Id { get; init; }
public required JsonData JsonData { get; init; }
}
public class UnrelatedEntity
{
public int Id { get; init; }
[MaxLength(200)] public required string Content { get; init; }
}
public class JsonData
{
[MaxLength(200)] public required string Author { get; init; }
}
Stack traces
dbug: 29/07/2025 20:03:41.547 CoreEventId.ContextInitialized[10403] (Microsoft.EntityFrameworkCore.Infrastructure)
Entity Framework Core 9.0.7 initialized 'LeakDbContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite:9.0.7' with options: None
dbug: 29/07/2025 20:03:41.569 CoreEventId.QueryCompilationStarting[10111] (Microsoft.EntityFrameworkCore.Query)
Compiling query expression:
'DbSet<LeakyEntity>()'
dbug: 29/07/2025 20:03:41.582 CoreEventId.NavigationBaseIncluded[10112] (Microsoft.EntityFrameworkCore.Query)
Including navigation: 'LeakyEntity.JsonData'.
dbug: 29/07/2025 20:03:41.746 CoreEventId.QueryExecutionPlanned[10107] (Microsoft.EntityFrameworkCore.Query)
Generated query execution expression:
'queryContext => SingleQueryingEnumerable.Create<LeakyEntity>(
relationalQueryContext: (RelationalQueryContext)queryContext,
relationalCommandResolver: parameters => [LIFTABLE Constant: RelationalCommandCache.QueryExpression(
Client Projections:
0 -> Dictionary<IProperty, int> { [Property: LeakyEntity.Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd, 0] }
1 -> JsonProjectionInfo
SELECT l.Id, l.JsonData ->
FROM LeakyEntities AS l) | Resolver: c => new RelationalCommandCache(
c.Dependencies.MemoryCache,
c.RelationalDependencies.QuerySqlGeneratorFactory,
c.RelationalDependencies.RelationalParameterBasedSqlProcessorFactory,
Client Projections:
0 -> Dictionary<IProperty, int> { [Property: LeakyEntity.Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd, 0] }
1 -> JsonProjectionInfo
SELECT l.Id, l.JsonData ->
FROM LeakyEntities AS l,
False,
new HashSet<string>(
new string[]{ },
StringComparer.Ordinal
)
)].GetRelationalCommandTemplate(parameters),
readerColumns: null,
shaper: (queryContext, dataReader, resultContext, resultCoordinator) =>
{
LeakyEntity entity;
Stream jsonStream;
JsonReaderData jsonReader;
Utf8JsonReaderManager jsonReaderManager;
object[] currentKeyValues;
entity =
{
MaterializationContext materializationContext1;
IEntityType entityType1;
LeakyEntity instance1;
InternalEntityEntry entry1;
bool hasNullKey1;
materializationContext1 = new MaterializationContext(
[LIFTABLE Constant: ValueBuffer | Resolver: _ => (object)ValueBuffer.Empty],
queryContext.Context
);
instance1 = default(LeakyEntity);
entry1 = queryContext.TryGetEntry(
key: [LIFTABLE Constant: Key: LeakyEntity.Id PK | Resolver: c => c.Dependencies.Model.FindEntityType("LeakyEntity").FindPrimaryKey()],
keyValues: new object[]{ (object)dataReader.GetInt32(0) },
throwOnNullKey: True,
hasNullKey: hasNullKey1);
!(hasNullKey1) ? entry1 != default(InternalEntityEntry) ?
{
entityType1 = entry1.EntityType;
return instance1 = (LeakyEntity)entry1.Entity;
} :
{
ISnapshot shadowSnapshot1;
shadowSnapshot1 = [LIFTABLE Constant: Snapshot | Resolver: _ => Snapshot.Empty];
entityType1 = [LIFTABLE Constant: EntityType: LeakyEntity | Resolver: namelessParameter{0} => namelessParameter{0}.Dependencies.Model.FindEntityType("LeakyEntity")];
instance1 = switch (entityType1)
{
case [LIFTABLE Constant: EntityType: LeakyEntity | Resolver: namelessParameter{1} => namelessParameter{1}.Dependencies.Model.FindEntityType("LeakyEntity")]:
{
return
{
LeakyEntity instance;
instance = new LeakyEntity();
instance.<Id>k__BackingField = dataReader.GetInt32(0);
(instance is IInjectableService) ? ((IInjectableService)instance).Injected(
context: materializationContext1.Context,
entity: instance,
queryTrackingBehavior: TrackAll,
structuralType: [LIFTABLE Constant: EntityType: LeakyEntity | Resolver: namelessParameter{2} => namelessParameter{2}.Dependencies.Model.FindEntityType("LeakyEntity")]) : default(void);
return instance;
}}
default:
default(LeakyEntity)
}
;
entry1 = entityType1 == default(IEntityType) ? default(InternalEntityEntry) : queryContext.StartTracking(
entityType: entityType1,
entity: instance1,
snapshot: shadowSnapshot1);
return instance1;
} : default(void);
return instance1;
};
jsonStream = dataReader.IsDBNull(1) ? default(MemoryStream) : new MemoryStream(Encoding.UTF8.GetBytes(dataReader.GetString(1)));
jsonReader = jsonStream == default(MemoryStream) ? default(JsonReaderData) : new JsonReaderData(jsonStream);
jsonReader != default(JsonReaderData) ?
{
jsonReaderManager = new Utf8JsonReaderManager(
jsonReader,
[LIFTABLE Constant: DiagnosticsLogger<Query> | Resolver: c => c.Dependencies.QueryLogger]
);
jsonReaderManager.MoveNext();
jsonReaderManager.CaptureState();
} : default(void);
currentKeyValues = new object[]{ (object)dataReader.GetInt32(0) };
ShaperProcessingExpressionVisitor.IncludeJsonEntityReference<LeakyEntity, JsonData>(
queryContext: queryContext,
keyPropertyValues: currentKeyValues,
jsonReaderData: jsonReader,
entity: entity,
innerShaper: (queryContext, namelessParameter{3}, namelessParameter{4}) =>
{
JsonData entityShaperMaterializer;
return entityShaperMaterializer =
{
MaterializationContext materializationContext2;
IEntityType entityType2;
JsonData instance2;
InternalEntityEntry entry2;
bool hasNullKey2;
materializationContext2 = new MaterializationContext(
[LIFTABLE Constant: ValueBuffer | Resolver: _ => (object)ValueBuffer.Empty],
queryContext.Context
);
instance2 = default(JsonData);
entry2 = queryContext.TryGetEntry(
key: [LIFTABLE Constant: Key: JsonData.LeakyEntityId PK | Resolver: c => c.Dependencies.Model.FindEntityType("JsonData").FindPrimaryKey()],
keyValues: new object[]{ namelessParameter{3}[0] },
throwOnNullKey: False,
hasNullKey: hasNullKey2);
!(hasNullKey2) ?
{
bool entityAlreadyTracked;
ISnapshot shadowSnapshot2;
entityAlreadyTracked = False;
shadowSnapshot2 = [LIFTABLE Constant: Snapshot | Resolver: _ => Snapshot.Empty];
entityType2 = [LIFTABLE Constant: EntityType: JsonData Owned | Resolver: namelessParameter{5} => namelessParameter{5}.Dependencies.Model.FindEntityType("JsonData")];
entry2 != default(InternalEntityEntry) ?
{
entityType2 = entry2.EntityType;
instance2 = (JsonData)entry2.Entity;
entityAlreadyTracked = True;
} : default(void);
instance2 =
{
Utf8JsonReaderManager jsonReaderManager;
JsonTokenType tokenType;
JsonData instance;
string namelessParameter{6};
jsonReaderManager = new Utf8JsonReaderManager(
namelessParameter{4},
[LIFTABLE Constant: DiagnosticsLogger<Query> | Resolver: c => c.Dependencies.QueryLogger]
);
tokenType = jsonReaderManager.CurrentReader.TokenType;
Loop(Break: done Continue: )
{
{
tokenType = jsonReaderManager.MoveNext();
switch (tokenType)
{
case PropertyName:
jsonReaderManager.CurrentReader.ValueTextEquals((ReadOnlySpan<byte>)Encoding.UTF8.GetBytes("Author")
.AsSpan()) ?
{
jsonReaderManager.MoveNext();
namelessParameter{6} = (string)[LIFTABLE Constant: JsonStringReaderWriter | Resolver: c => c.Dependencies.Model.FindEntityType("JsonData").FindProperty("Author").GetJsonValueReaderWriter() ?? c.Dependencies.Model.FindEntityType("JsonData").FindProperty("Author").GetTypeMapping().JsonValueReaderWriter].FromJsonTyped(
manager: jsonReaderManager,
existingObject: default(object));
} : default(void)
case EndObject:
Goto(break done)
default:
{
jsonReaderManager.Skip();
}
}
}}
jsonReaderManager.CaptureState();
!(entityAlreadyTracked) ? shadowSnapshot2 = (ISnapshot)new Snapshot<int>((int)namelessParameter{3}[0]) : default(void);
entityAlreadyTracked ?
{
instance = instance2;
} :
{
instance = new JsonData();
instance.<Author>k__BackingField = namelessParameter{6};
(instance is IInjectableService) ? ((IInjectableService)instance).Injected(
context: materializationContext2.Context,
entity: instance,
queryTrackingBehavior: TrackAll,
structuralType: [LIFTABLE Constant: EntityType: JsonData Owned | Resolver: namelessParameter{7} => namelessParameter{7}.Dependencies.Model.FindEntityType("JsonData")]) : default(void);
};
return instance;
};
!(entityAlreadyTracked || entityType2 == default(IEntityType)) ?
{
queryContext.StartTracking(
entityType: entityType2,
entity: instance2,
snapshot: shadowSnapshot2);
} : default(void);
} : default(void);
return instance2;
};
},
fixup: (namelessParameter{8}, namelessParameter{9}) =>
{
return namelessParameter{8}.<JsonData>k__BackingField = namelessParameter{9};
},
trackingQuery: True);
return entity;
},
contextType: LeakDbContext,
standAloneStateManager: False,
detailedErrorsEnabled: False,
threadSafetyChecksEnabled: True)'
dbug: 29/07/2025 20:03:41.761 RelationalEventId.ConnectionCreating[20005] (Microsoft.EntityFrameworkCore.Database.Connection)
Creating DbConnection.
dbug: 29/07/2025 20:03:41.762 RelationalEventId.ConnectionCreated[20006] (Microsoft.EntityFrameworkCore.Database.Connection)
Created DbConnection. (0ms).
dbug: 29/07/2025 20:03:41.762 RelationalEventId.ConnectionOpening[20000] (Microsoft.EntityFrameworkCore.Database.Connection)
Opening connection to database 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db'.
dbug: 29/07/2025 20:03:41.763 RelationalEventId.ConnectionOpened[20001] (Microsoft.EntityFrameworkCore.Database.Connection)
Opened connection to database 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db'.
dbug: 29/07/2025 20:03:41.763 RelationalEventId.CommandCreating[20103] (Microsoft.EntityFrameworkCore.Database.Command)
Creating DbCommand for 'ExecuteReader'.
dbug: 29/07/2025 20:03:41.764 RelationalEventId.CommandCreated[20104] (Microsoft.EntityFrameworkCore.Database.Command)
Created DbCommand for 'ExecuteReader' (0ms).
dbug: 29/07/2025 20:03:41.764 RelationalEventId.CommandInitialized[20106] (Microsoft.EntityFrameworkCore.Database.Command)
Initialized DbCommand for 'ExecuteReader' (1ms).
dbug: 29/07/2025 20:03:41.766 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT "l"."Id", "l"."JsonData"
FROM "LeakyEntities" AS "l"
info: 29/07/2025 20:03:41.774 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT "l"."Id", "l"."JsonData"
FROM "LeakyEntities" AS "l"
dbug: 29/07/2025 20:03:41.777 CoreEventId.StartedTracking[10806] (Microsoft.EntityFrameworkCore.ChangeTracking)
Context 'LeakDbContext' started tracking 'LeakyEntity' entity. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see key values.
dbug: 29/07/2025 20:03:41.788 CoreEventId.ReferenceChangeDetected[10805] (Microsoft.EntityFrameworkCore.ChangeTracking)
The navigation 'LeakyEntity.JsonData' was detected as changed. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see key values.
dbug: 29/07/2025 20:03:41.789 CoreEventId.StartedTracking[10806] (Microsoft.EntityFrameworkCore.ChangeTracking)
Context 'LeakDbContext' started tracking 'JsonData' entity. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see key values.
dbug: 29/07/2025 20:03:41.789 RelationalEventId.DataReaderClosing[20301] (Microsoft.EntityFrameworkCore.Database.Command)
Closing data reader to 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db'.
dbug: 29/07/2025 20:03:41.791 RelationalEventId.DataReaderDisposing[20300] (Microsoft.EntityFrameworkCore.Database.Command)
A data reader for 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db' is being disposed after spending 15ms reading results.
dbug: 29/07/2025 20:03:41.791 RelationalEventId.ConnectionClosing[20002] (Microsoft.EntityFrameworkCore.Database.Connection)
Closing connection to database 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db'.
dbug: 29/07/2025 20:03:41.791 RelationalEventId.ConnectionClosed[20003] (Microsoft.EntityFrameworkCore.Database.Connection)
Closed connection to database 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db' (0ms).
dbug: 29/07/2025 20:03:41.791 CoreEventId.QueryCompilationStarting[10111] (Microsoft.EntityFrameworkCore.Query)
Compiling query expression:
'DbSet<UnrelatedEntity>()'
dbug: 29/07/2025 20:03:41.793 CoreEventId.QueryExecutionPlanned[10107] (Microsoft.EntityFrameworkCore.Query)
Generated query execution expression:
'queryContext => SingleQueryingEnumerable.Create<UnrelatedEntity>(
relationalQueryContext: (RelationalQueryContext)queryContext,
relationalCommandResolver: parameters => [LIFTABLE Constant: RelationalCommandCache.QueryExpression(
Projection Mapping:
EmptyProjectionMember -> Dictionary<IProperty, int> { [Property: UnrelatedEntity.Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd, 0], [Property: UnrelatedEntity.Content (string) Required MaxLength(200), 1] }
SELECT u.Id, u.Content
FROM UnrelatedEntities AS u) | Resolver: c => new RelationalCommandCache(
c.Dependencies.MemoryCache,
c.RelationalDependencies.QuerySqlGeneratorFactory,
c.RelationalDependencies.RelationalParameterBasedSqlProcessorFactory,
Projection Mapping:
EmptyProjectionMember -> Dictionary<IProperty, int> { [Property: UnrelatedEntity.Id (int) Required PK AfterSave:Throw ValueGenerated.OnAdd, 0], [Property: UnrelatedEntity.Content (string) Required MaxLength(200), 1] }
SELECT u.Id, u.Content
FROM UnrelatedEntities AS u,
False,
new HashSet<string>(
new string[]{ },
StringComparer.Ordinal
)
)].GetRelationalCommandTemplate(parameters),
readerColumns: null,
shaper: (queryContext, dataReader, resultContext, resultCoordinator) =>
{
UnrelatedEntity entity;
entity =
{
MaterializationContext materializationContext1;
IEntityType entityType1;
UnrelatedEntity instance1;
InternalEntityEntry entry1;
bool hasNullKey1;
materializationContext1 = new MaterializationContext(
[LIFTABLE Constant: ValueBuffer | Resolver: _ => (object)ValueBuffer.Empty],
queryContext.Context
);
instance1 = default(UnrelatedEntity);
entry1 = queryContext.TryGetEntry(
key: [LIFTABLE Constant: Key: UnrelatedEntity.Id PK | Resolver: c => c.Dependencies.Model.FindEntityType("UnrelatedEntity").FindPrimaryKey()],
keyValues: new object[]{ (object)dataReader.GetInt32(0) },
throwOnNullKey: True,
hasNullKey: hasNullKey1);
!(hasNullKey1) ? entry1 != default(InternalEntityEntry) ?
{
entityType1 = entry1.EntityType;
return instance1 = (UnrelatedEntity)entry1.Entity;
} :
{
ISnapshot shadowSnapshot1;
shadowSnapshot1 = [LIFTABLE Constant: Snapshot | Resolver: _ => Snapshot.Empty];
entityType1 = [LIFTABLE Constant: EntityType: UnrelatedEntity | Resolver: namelessParameter{0} => namelessParameter{0}.Dependencies.Model.FindEntityType("UnrelatedEntity")];
instance1 = switch (entityType1)
{
case [LIFTABLE Constant: EntityType: UnrelatedEntity | Resolver: namelessParameter{1} => namelessParameter{1}.Dependencies.Model.FindEntityType("UnrelatedEntity")]:
{
return
{
UnrelatedEntity instance;
instance = new UnrelatedEntity();
instance.<Id>k__BackingField = dataReader.GetInt32(0);
instance.<Content>k__BackingField = dataReader.GetString(1);
(instance is IInjectableService) ? ((IInjectableService)instance).Injected(
context: materializationContext1.Context,
entity: instance,
queryTrackingBehavior: TrackAll,
structuralType: [LIFTABLE Constant: EntityType: UnrelatedEntity | Resolver: namelessParameter{2} => namelessParameter{2}.Dependencies.Model.FindEntityType("UnrelatedEntity")]) : default(void);
return instance;
}}
default:
default(UnrelatedEntity)
}
;
entry1 = entityType1 == default(IEntityType) ? default(InternalEntityEntry) : queryContext.StartTracking(
entityType: entityType1,
entity: instance1,
snapshot: shadowSnapshot1);
return instance1;
} : default(void);
return instance1;
};
return entity;
},
contextType: LeakDbContext,
standAloneStateManager: False,
detailedErrorsEnabled: False,
threadSafetyChecksEnabled: True)'
dbug: 29/07/2025 20:03:41.795 RelationalEventId.ConnectionOpening[20000] (Microsoft.EntityFrameworkCore.Database.Connection)
Opening connection to database 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db'.
dbug: 29/07/2025 20:03:41.795 RelationalEventId.ConnectionOpened[20001] (Microsoft.EntityFrameworkCore.Database.Connection)
Opened connection to database 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db'.
dbug: 29/07/2025 20:03:41.795 RelationalEventId.CommandCreating[20103] (Microsoft.EntityFrameworkCore.Database.Command)
Creating DbCommand for 'ExecuteReader'.
dbug: 29/07/2025 20:03:41.795 RelationalEventId.CommandCreated[20104] (Microsoft.EntityFrameworkCore.Database.Command)
Created DbCommand for 'ExecuteReader' (0ms).
dbug: 29/07/2025 20:03:41.795 RelationalEventId.CommandInitialized[20106] (Microsoft.EntityFrameworkCore.Database.Command)
Initialized DbCommand for 'ExecuteReader' (0ms).
dbug: 29/07/2025 20:03:41.795 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT "u"."Id", "u"."Content"
FROM "UnrelatedEntities" AS "u"
info: 29/07/2025 20:03:41.795 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT "u"."Id", "u"."Content"
FROM "UnrelatedEntities" AS "u"
dbug: 29/07/2025 20:03:41.795 CoreEventId.StartedTracking[10806] (Microsoft.EntityFrameworkCore.ChangeTracking)
Context 'LeakDbContext' started tracking 'UnrelatedEntity' entity. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see key values.
dbug: 29/07/2025 20:03:41.795 CoreEventId.StartedTracking[10806] (Microsoft.EntityFrameworkCore.ChangeTracking)
Context 'LeakDbContext' started tracking 'UnrelatedEntity' entity. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see key values.
dbug: 29/07/2025 20:03:41.795 RelationalEventId.DataReaderClosing[20301] (Microsoft.EntityFrameworkCore.Database.Command)
Closing data reader to 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db'.
dbug: 29/07/2025 20:03:41.795 RelationalEventId.DataReaderDisposing[20300] (Microsoft.EntityFrameworkCore.Database.Command)
A data reader for 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db' is being disposed after spending 0ms reading results.
dbug: 29/07/2025 20:03:41.795 RelationalEventId.ConnectionClosing[20002] (Microsoft.EntityFrameworkCore.Database.Connection)
Closing connection to database 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db'.
dbug: 29/07/2025 20:03:41.795 RelationalEventId.ConnectionClosed[20003] (Microsoft.EntityFrameworkCore.Database.Connection)
Closed connection to database 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db' (0ms).
dbug: 29/07/2025 20:03:41.798 CoreEventId.ContextDisposed[10407] (Microsoft.EntityFrameworkCore.Infrastructure)
'LeakDbContext' disposed.
dbug: 29/07/2025 20:03:41.799 RelationalEventId.ConnectionDisposing[20007] (Microsoft.EntityFrameworkCore.Database.Connection)
Disposing connection to database 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db'.
dbug: 29/07/2025 20:03:41.799 RelationalEventId.ConnectionDisposed[20008] (Microsoft.EntityFrameworkCore.Database.Connection)
Disposed connection to database 'main' on server '/Users/christiaan-ce/Library/Application Support/ef-core-leak.db' (0ms
Verbose output
EF Core version
9.0.7
Database provider
Microsoft.EntityFramework.SqlServer
Target framework
.NET 9.0
Operating system
Alpine linux, macOS
IDE
Rider 2025.2