Fix threads being cross-disposed from DatabaseContextFactory

This commit is contained in:
smoogipoo 2018-08-22 14:07:52 +09:00
parent 0d4dbee34b
commit 50b8daf939
2 changed files with 10 additions and 2 deletions

View File

@ -5,7 +5,6 @@
using System.Linq;
using System.Threading;
using Microsoft.EntityFrameworkCore.Storage;
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Platform;
namespace osu.Game.Database
@ -118,7 +117,9 @@ private void usageCompleted(DatabaseWriteUsage usage)
private void recycleThreadContexts()
{
threadContexts?.Values.ForEach(c => c.Dispose());
// Contexts for other threads are not disposed as they may be in use elsewhere. Instead, fresh contexts are exposed
// for other threads to use, and we rely on the finalizer inside OsuDbContext to handle their previous contexts
threadContexts?.Value.Dispose();
threadContexts = new ThreadLocal<OsuDbContext>(CreateContext, true);
}

View File

@ -75,6 +75,13 @@ public OsuDbContext(string connectionString)
}
}
~OsuDbContext()
{
// DbContext does not contain a finalizer (https://github.com/aspnet/EntityFrameworkCore/issues/8872)
// This is used to clean up previous contexts when fresh contexts are exposed via DatabaseContextFactory
Dispose();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);