0
kansoftware created
Hi,
Is any function available in AspNetZero for appliying With nolock. We checked in this URL https://github.com/aspnetboilerplate/aspnetboilerplate/issues/1637 . But this in AspNetBoilerplate.
Thanks
3 Answer(s)
-
0
Hi kansoftware, In EF Core, you can use DbCommandInterceptor to add the
NOLOCK
feature.QueryWithNoLockDbCommandInterceptor
:public class QueryWithNoLockDbCommandInterceptor : DbCommandInterceptor { private static readonly Regex TableAliasRegex = new Regex(@"(?<tableAlias>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 Task<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 Task<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); } }
In your EF Core module, You can register a custom interceptor. example:
public override void PreInitialize() { if (!SkipDbContextRegistration) { Configuration.Modules.AbpEfCore().AddDbContext<QADemoDbContext>(options => { if (options.ExistingConnection != null) { QADemoDbContextConfigurer.Configure(options.DbContextOptions, options.ExistingConnection); } else { QADemoDbContextConfigurer.Configure(options.DbContextOptions, options.ConnectionString); } // Register your interceptor. options.DbContextOptions.AddInterceptors(new QueryWithNoLockDbCommandInterceptor()); }); } }
-
0
Thanks
I just want to know how to use it with entity . Can we use this with multiple joins in linq lambda query also?
-
0
Hi kansoftware, There is currently no LINQ Lambda form of NOLOCK extension method. If you want to achieve the same effect as NOLOCK, you can also control the transaction isolation level.
Have an answer to this question?
Log in
and write your answer.