c# - Get Entity Framework 6 在其下方的 SELECT 语句中使用 NOLOCK

标签 c# sql .net sql-server entity-framework

我在 MVC 5 项目中使用 Entity Framework 6。如您所知,如果我们在其中使用 WITH (NOLOCK),SQL Server 中的 SELECT 查询将执行得更快、更高效。我检查了一些 Entity Framework 6 生成的 SQL SELECT 语句,发现它们都不包含 NOLOCK。

我不想在获取操作中使用事务来读取未提交的事务。

如何强制 EF 6 在下面生成的 SELECT 语句中使用 NOLOCK?

最佳答案

首先...您永远不应该对每个 SQL 语句使用 NOLOCK。它可能会损害您数据的完整性。

它就像任何其他查询提示一样,是一种只有在您执行异常操作时才应使用的机制。

无法告诉 EF 提供程序呈现 NoLock 提示。如果您确实需要读取未提交的数据,您有以下选择。

  1. 编写您自己的 EntityFramework 提供程序。

  2. 使用命令拦截器在语句被执行之前修改语句 执行。 http://msdn.microsoft.com/en-us/data/dn469464.aspx

  3. 使用具有 IsolationLevel.ReadUncommited 的 TransactionScope。

我知道您说过您不想使用事务,但它是读取未提交数据的唯一开箱即用方式。此外,它不会产生太多开销,因为 SQL Server 中的每个语句都“隐式”在事务中运行。

using (new TransactionScope(
                    TransactionScopeOption.Required, 
                    new TransactionOptions 
                    { 
                         IsolationLevel = IsolationLevel.ReadUncommitted 
                    })) 
{
        using (var db = new MyDbContext()) { 
            // query
        }
}

编辑: 还需要注意的是,从 SQL Server 2016 开始,Microsoft 已弃用用于更新和删除的 NOLOCK(选择保持不变),并将在“一个” future 版本中删除。

https://learn.microsoft.com/en-us/sql/database-engine/deprecated-database-engine-features-in-sql-server-2016?view=sql-server-2017

关于c# - Get Entity Framework 6 在其下方的 SELECT 语句中使用 NOLOCK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24684914/

相关文章:

sql - 根据前置条件对 SQL 结果进行排序

c# - 自动生成的备用 key

C# - 用 DataTable 填充组合框

.net - 正则表达式验证长度为 6 的字符串中最多 2 个数字和最多 4 个字母

c# - Xamarin 表格 : Check if user inactive after some time log out app

c# - 如何使用 C# 泛型将这 3 种方法变成一种方法?

c# - 在 VisualStateManager 中交换画笔

c# - 何时在 MVC4 中使用包

mysql - 如果其中至少一行符合条件,则排除组

c# - .NET 中的 DLL 可以使用不同的扩展名吗?米勒?