繁体   English   中英

C# 向用户定义的 EF 查询添加 NOLOCK

[英]C# Adding a NOLOCK to a user-defined EF query

我有以下用户定义的查询:

        var outerRingEntities = await Databases.OuterRing.Set<TOuterEntity>()
                                .AsNoTracking()
                                .Where(transformer.ShouldQueryItem)
                                .Where(x => LastSyncTime == null || x.ChangedDate > LastSyncTime)
                                .OrderBy(p => p.ChangedDate)
                                .Skip(index)
                                .Take(_pageSize)
                                .ToListAsync(cancellationToken);

目标是向该查询添加“NOLOCK”。 为此,我研究并尝试了很多不同的东西,但我仍然没有解决方案:

尝试1:我查看了以下链接: How to use SqlAzureExecutionStrategy and "Nolock"

我能够添加SuspendableSqlAzureExecutionStrategy但唯一的问题是System.Runtime.Remoting.Messaging 我能够在 .NET Framework 4.8 中找到此 dll,但消息传递仍然存在问题。 修改类后,我仍然收到以下错误:

"The configured execution strategy 'SqlServerRetryingExecutionStrategy' does not support user initiated transactions. Use the execution strategy returned by 'DbContext.Database.CreateExecutionStrategy()' to execute all the operations in the transaction as a retriable unit."

尝试 2:我按照此博客中的说明进行操作: https ://dotnetdocs.ir/Post/38/implementing-nolock-in-entityframework-

按照博客上的说明,我修改了如下代码:

    var outerRingEntities = await Databases.OuterRing.Set<TOuterEntity>()
                            .AsNoTracking()
                            .Where(transformer.ShouldQueryItem)
                            .Where(x => LastSyncTime == null || x.ChangedDate > LastSyncTime)
                            .OrderBy(p => p.ChangedDate)
                            .Skip(index)
                            .Take(_pageSize)
                            .ToListWithNoLockAsync(cancellationToken);

从这个查询中,我们可以看到我正在使用一个扩展方法,这个方法是在提供的链接中定义的。

但是我仍然遇到与第一次尝试相同的错误。

有没有办法让我实现我的目标,以便我执行查询以及向 EF 查询添加一个 nolock。 请指教。

提前致谢。

  1. NOLOCK是邪恶的。 不要这样做。 使用 READ COMMITTED SNAPSHOT 数据库选项或设置的 SNAPSHOT 隔离级别。

  2. 如果您打开 DbContext 的数据库连接,它将在 DbContext 生命周期内保持打开状态。 因此,您可以启动 ReadUncommited事务,或更改 TSQL 中的事务隔离级别,后续查询将运行脏读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM