Я использую EntityFrameworkCore для бота Discord с базой данных MySQL. Само по себе все работает очень хорошо, но каждый раз, когда я обращаюсь к DbContext
, создаются некоторые объекты, которые никогда не удаляются снова. В Visual Studio Diagnosti c Tools после нескольких запросов к базе данных это выглядит так:
Вот как я интегрирую 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: Код моего бота