Хотя я абсолютно согласен с тем, что использование уровня изоляции транзакций Read Uncommitted - лучший выбор, но некоторое время вы вынуждены использовать подсказку NOLOCK по запросу менеджера или клиента, и никаких причин против этого не принято.
С помощью Entity Framework 6 вы можете реализовать собственный DbCommandInterceptor следующим образом:
public class NoLockInterceptor : DbCommandInterceptor
{
private static readonly Regex _tableAliasRegex =
new Regex(@"(?<tableAlias>AS \[Extent\d+\](?! WITH \(NOLOCK\)))",
RegexOptions.Multiline | RegexOptions.IgnoreCase);
[ThreadStatic]
public static bool SuppressNoLock;
public override void ScalarExecuting(DbCommand command,
DbCommandInterceptionContext<object> interceptionContext)
{
if (!SuppressNoLock)
{
command.CommandText =
_tableAliasRegex.Replace(command.CommandText, "${tableAlias} WITH (NOLOCK)");
}
}
public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
if (!SuppressNoLock)
{
command.CommandText =
_tableAliasRegex.Replace(command.CommandText, "${tableAlias} WITH (NOLOCK)");
}
}
}
С этим классом вы можете применить его при запуске приложения:
DbInterception.Add(new NoLockInterceptor());
И условно отключить добавление подсказки NOLOCK
в запросы для текущего потока:
NoLockInterceptor.SuppressNoLock = true;