控制EF4中的ArithAbort

4
我们的EF4 MVC解决方案出现了一些性能问题。我们已经追踪到在所有连接到数据库之前,ArithAbort被设置为关闭,现在我们正在尝试强制将其保持为“ON”。
我们查看了: Linq to SQL发出的“SET”语句如何控制 但似乎EF4在每次查询之前都会重置连接,因此这不起作用。
到目前为止,我们已经尝试在给定查询之前使用“set ArithAbort on”,但没有成功。我们还尝试了长路走,创建一个新连接并在其中设置它,但仍然没有运气。
那么,有人知道如何在针对数据库进行任何linq查询之前设置它吗?
更改数据库设置不是选项。
编辑: 根据Andiihs的建议,我尝试了包装器解决方案,并向EFCachingCommand类中添加了以下代码行。
    protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
    {
        if (this.WrappedCommand.CommandType == System.Data.CommandType.Text)
        {
            this.WrappedCommand.CommandText = "set arithabort on; " + this.WrappedCommand.CommandText;
        }

这基本上确保了任何Linq-sql调用都会以正确的设置语句为前缀。
我还需要添加:
    DbFunctionCommandTree functionTree = commandTree as DbFunctionCommandTree;
    if (functionTree != null)
    {
        this.IsModification = true;
        return;
    }

为了使EFCachingCommandDefinition中的GetAffectedEntitySets函数能够与存储过程调用正常工作。

感谢您发布这个问题。MSDN上的链接文章非常长。您能否请发表一个完整的答案,详细说明如何逐步解决这个问题?谢谢! - Shaul Behr
我必须承认,我已经有一段时间没有处理这个问题了。我相当确定我所做的就是直接包含Andiih在他的回答中首先链接的包装类,然后按照我的修改后的问题描述进行修改。 - Grubsnik
1个回答

4

看起来是一个非常好的开始。我会去挖掘并看看我能找到什么。 - Grubsnik
1
你能分享一下你想到的东西吗? - Andiih
有没有不需要经过这么大的变通方式就能设置arithabort的方法? - Shaul Behr
据我的判断,目前为止还没有。然而,一旦你把它们放在适当的位置,它也会为你提供一个方便的地方,让你在EF执行某些你无法确切诊断的奇怪操作时设置一个断点。 - Grubsnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接