From 06469c528c4f097993c950c7ba4db0dc84960acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Thu, 18 Dec 2025 17:56:55 +0300 Subject: [PATCH 1/2] Add provider check to SqliteBusyTimeout interceptor Updated SqliteBusyTimeoutSaveChangesInterceptor to execute the PRAGMA command only if the DbContext is using the Sqlite provider. This prevents unnecessary execution for non-Sqlite databases. --- .../SqliteBusyTimeoutSaveChangesInterceptor.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Interceptors/SqliteBusyTimeoutSaveChangesInterceptor.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Interceptors/SqliteBusyTimeoutSaveChangesInterceptor.cs index 32b4859bbb..1caada4592 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Interceptors/SqliteBusyTimeoutSaveChangesInterceptor.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Interceptors/SqliteBusyTimeoutSaveChangesInterceptor.cs @@ -19,7 +19,7 @@ public class SqliteBusyTimeoutSaveChangesInterceptor : SaveChangesInterceptor public override InterceptionResult SavingChanges(DbContextEventData eventData, InterceptionResult result) { - if (eventData.Context != null) + if (eventData.Context != null && IsSqlite(eventData.Context)) { eventData.Context.Database.ExecuteSqlRaw(_pragmaCommand); } @@ -29,11 +29,17 @@ public class SqliteBusyTimeoutSaveChangesInterceptor : SaveChangesInterceptor public override async ValueTask> SavingChangesAsync(DbContextEventData eventData, InterceptionResult result, CancellationToken cancellationToken = default) { - if (eventData.Context != null) + if (eventData.Context != null && IsSqlite(eventData.Context)) { await eventData.Context.Database.ExecuteSqlRawAsync(_pragmaCommand, cancellationToken: cancellationToken); } return await base.SavingChangesAsync(eventData, result, cancellationToken); } + + + private bool IsSqlite(DbContext context) + { + return context.Database.ProviderName != null && context.Database.ProviderName.Contains("Sqlite"); + } } From 4e629c0b784d042bc27725a8c7c7b70224804abb Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 19 Dec 2025 09:48:13 +0800 Subject: [PATCH 2/2] Refine Sqlite interceptor registration logic --- .../SqliteBusyTimeoutSaveChangesInterceptor.cs | 10 ++-------- .../Sqlite/AbpEntityFrameworkCoreSqliteModule.cs | 7 ++++++- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Interceptors/SqliteBusyTimeoutSaveChangesInterceptor.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Interceptors/SqliteBusyTimeoutSaveChangesInterceptor.cs index 1caada4592..32b4859bbb 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Interceptors/SqliteBusyTimeoutSaveChangesInterceptor.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Interceptors/SqliteBusyTimeoutSaveChangesInterceptor.cs @@ -19,7 +19,7 @@ public class SqliteBusyTimeoutSaveChangesInterceptor : SaveChangesInterceptor public override InterceptionResult SavingChanges(DbContextEventData eventData, InterceptionResult result) { - if (eventData.Context != null && IsSqlite(eventData.Context)) + if (eventData.Context != null) { eventData.Context.Database.ExecuteSqlRaw(_pragmaCommand); } @@ -29,17 +29,11 @@ public class SqliteBusyTimeoutSaveChangesInterceptor : SaveChangesInterceptor public override async ValueTask> SavingChangesAsync(DbContextEventData eventData, InterceptionResult result, CancellationToken cancellationToken = default) { - if (eventData.Context != null && IsSqlite(eventData.Context)) + if (eventData.Context != null) { await eventData.Context.Database.ExecuteSqlRawAsync(_pragmaCommand, cancellationToken: cancellationToken); } return await base.SavingChangesAsync(eventData, result, cancellationToken); } - - - private bool IsSqlite(DbContext context) - { - return context.Database.ProviderName != null && context.Database.ProviderName.Contains("Sqlite"); - } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpEntityFrameworkCoreSqliteModule.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpEntityFrameworkCoreSqliteModule.cs index 6b767ceee4..87d58f2a82 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpEntityFrameworkCoreSqliteModule.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo/Abp/EntityFrameworkCore/Sqlite/AbpEntityFrameworkCoreSqliteModule.cs @@ -1,3 +1,5 @@ +using System.Linq; +using Microsoft.EntityFrameworkCore.Sqlite.Infrastructure.Internal; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.EntityFrameworkCore.GlobalFilters; using Volo.Abp.EntityFrameworkCore.Interceptors; @@ -32,7 +34,10 @@ public class AbpEntityFrameworkCoreSqliteModule : AbpModule { options.ConfigureDefaultOnConfiguring((dbContext, dbContextOptionsBuilder) => { - dbContextOptionsBuilder.AddInterceptors(new SqliteBusyTimeoutSaveChangesInterceptor(sqliteOptions.BusyTimeout.Value)); + if (dbContextOptionsBuilder.Options.Extensions.Any(extension => extension is SqliteOptionsExtension)) + { + dbContextOptionsBuilder.AddInterceptors(new SqliteBusyTimeoutSaveChangesInterceptor(sqliteOptions.BusyTimeout.Value)); + } }, overrideExisting: false); }); }