ef core 添加拦截器

public class WithNoLockInterceptor : DbCommandInterceptor
{
    private static readonly Regex TableAliasRegex =
     new Regex(@"(?<tableAlias>(FROM|JOIN) \[[a-zA-Z]\w*\] AS \[[a-zA-Z]\w*\](?! WITH \(NOLOCK\)))",
         RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase);

    public override InterceptionResult<object> ScalarExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<object> result)
    {
        command.CommandText = TableAliasRegex.Replace(
            command.CommandText,
            "${tableAlias} WITH (NOLOCK)");
        return base.ScalarExecuting(command, eventData, result);
    }

    public override ValueTask<InterceptionResult<object>> ScalarExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<object> result, CancellationToken cancellationToken = new CancellationToken())
    {
        command.CommandText = TableAliasRegex.Replace(
            command.CommandText,
            "${tableAlias} WITH (NOLOCK)");
        return base.ScalarExecutingAsync(command, eventData, result, cancellationToken);
    }

    public override InterceptionResult<DbDataReader> ReaderExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result)
    {
        command.CommandText = TableAliasRegex.Replace(
            command.CommandText,
            "${tableAlias} WITH (NOLOCK)");
        return result;
    }

    public override ValueTask<InterceptionResult<DbDataReader>> ReaderExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result, CancellationToken cancellationToken = new CancellationToken())
    {
        command.CommandText = TableAliasRegex.Replace(
            command.CommandText,
            "${tableAlias} WITH (NOLOCK)");
        return base.ReaderExecutingAsync(command, eventData, result, cancellationToken); ;
    }
}

 

应用

 public override void ConfigureServices(ServiceConfigurationContext context)
 {
     Configure<AbpDbContextOptions>(options =>
     {
         options.Configure<SleeveMillingDbContext>(c =>
         {
             c.UseMySQL(b =>
             {
                 b.MigrationsHistoryTable("__SleeveMilling_Migrations");
                 b.MigrationsAssembly(GetType().Assembly.GetName().Name);
             }).AddInterceptors(new WithNoLockInterceptor());

         });
     });
 }

 

posted @ 2025-01-02 09:05  韩梦芫  阅读(76)  评论(0)    收藏  举报