我在 MVC 5 项目中使用 Entity Framework 6。如您所知,如果我们在其中使用 WITH (NOLOCK)
,SQL Server 中的 SELECT
查询将执行得更快、更高效。我检查了一些 Entity Framework 6 生成的 SQL SELECT 语句,发现它们都不包含 NOLOCK。
我不想在获取操作中使用事务来读取未提交的事务。
如何强制 EF 6 在下面生成的 SELECT 语句中使用 NOLOCK?
最佳答案
首先...您永远不应该对每个 SQL 语句使用 NOLOCK。它可能会损害您数据的完整性。
它就像任何其他查询提示一样,是一种只有在您执行异常操作时才应使用的机制。
无法告诉 EF 提供程序呈现 NoLock 提示。如果您确实需要读取未提交的数据,您有以下选择。
编写您自己的 EntityFramework 提供程序。
使用命令拦截器在语句被执行之前修改语句 执行。 http://msdn.microsoft.com/en-us/data/dn469464.aspx
使用具有 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 版本中删除。
关于c# - Get Entity Framework 6 在其下方的 SELECT 语句中使用 NOLOCK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24684914/