Утечка памяти ядра Entity Framework? - PullRequest
2 голосов
/ 24 апреля 2020

Я использую EntityFrameworkCore для бота Discord с базой данных MySQL. Само по себе все работает очень хорошо, но каждый раз, когда я обращаюсь к DbContext, создаются некоторые объекты, которые никогда не удаляются снова. В Visual Studio Diagnosti c Tools после нескольких запросов к базе данных это выглядит так: enter image description here

Вот как я интегрирую Entity Framework в свою программу:

var services = new ServiceCollection().AddDbContext<DatabaseContext>(x => x.UseMySql("server=localhost;database=testdb;user=root"));

Это вызывает мой метод расширения:

public static IServiceCollection AddDbContext<TContext>(this IServiceCollection This,
            Action<DbContextOptionsBuilder> optionsBuilder)
            where TContext : DbContext
        {
            return This
                .AddSingleton(x =>
                {
                    var builder = new DbContextOptionsBuilder<TContext>();
                    optionsBuilder(builder);
                    return builder.Options;
                })
                .AddTransient<TContext>()
                .AddTransient<DbContext>(x => x.GetRequiredService<TContext>());
        }

Мой DatabaseContext выглядит так:

public class DatabaseContext : DbContext
{
     public DbSet<GuildEntity> Guilds { get; set; }

     public DatabaseContext(DbContextOptions<DatabaseContext> options)
                : base(options)
     {
     }

     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
          modelBuilder.Entity<GuildEntity>(entity =>
          {
              entity.Property(x => x.Level).HasDefaultValue(true);

              entity.Property(x => x.Notify).HasDefaultValue(false);

              entity.Property(x => x.Log).HasDefaultValue(false);

              entity.Property(x => x.Trash).HasDefaultValue(false);
          });
     }
}

У меня также есть этот DatabaseService, с которым я получаю DatabaseContext:

public class DatabaseService
{
    private readonly IServiceProvider _serviceProvider;

    public DatabaseService(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public TContext Open<TContext>() where TContext : DbContext
    {
        return _serviceProvider.GetRequiredService<TContext>();
    }
}

И вот как я делаю запрос к базе данных:

using (var db = _databaseService.Open<DatabaseContext>())
{
    var guilds = db.Guilds.Where(p => p.GuildName == "MyGuild");
}

Даже если я включаю AsNoTracking() в запрос, объекты создаются для этого запроса которые никогда не утилизируются.

Я абсолютно не знаю, где моя ошибка, я надеюсь, что моих примеров достаточно, чтобы увидеть ошибку. Если нет, то вот репозиторий GitHub моего Discord Bot: Код моего бота

...