Sql EF做了什么疯狂的事吗?

Sql EF做了什么疯狂的事吗?,sql,tsql,entity-framework-6,Sql,Tsql,Entity Framework 6,我们有EF6代码 var existingProduct = _productContext.Product.FirstOrDefault( s => s.Name.ToUpper().Trim() == productDto.Name.ToUpper().Trim() && s.IDReference == productDto.IDReference); if (ex

我们有EF6代码

        var existingProduct = _productContext.Product.FirstOrDefault(
               s => s.Name.ToUpper().Trim() == productDto.Name.ToUpper().Trim() 
                    && s.IDReference == productDto.IDReference);
        if (existingProduct != null)
        {
            return existingProduct;
        }

        _productContext.Product.Add(productDto);
        _productContext.SaveChanges();
        return productDto;
它有时工作,有时不工作,它超时了,我们得到这个错误

更新条目时出错。查看内部异常 详情请参阅。更新条目时出错。见 详细信息的内部异常。执行超时已过期。超时 操作完成前经过的时间或服务器已关闭 没有回应。声明已终止。等待操作 超时

我做错什么了吗?锁上什么了吗

它表明它阻塞了如下的东西


代码的其余部分是否锁定了某些内容?您使用的是显式事务还是TransactionScope?您发布的内容显示,其他一些连接已锁定该连接table@PanagiotisKanavos这是一个庞大的系统,可能在其他地方发生了,代码会是什么样子,我可以做一个搜索活动监视器已经告诉你哪个连接占用了这些锁。查看该连接的
进程
窗格,并检查右键单击、详细信息所做的操作。您使用的查询保证了完整表扫描和完整表锁定。这是因为您在任何地方都使用
ToUpper()
Trim()
。这会阻止服务器使用任何基础索引,强制进行完整表扫描。为什么要使用
ToUpper()
?除非使用区分大小写的排序规则,否则SQL中的比较不区分大小写。至于trim,您真的希望名称后面有空格吗?为什么不提前清理呢?索引是使用当前数据值和排序规则构建的。当您试图搜索由表达式计算的值时,它们将变得无用