我们的EF4 MVC解决方案出现了一些性能问题。我们已经追踪到在所有连接到数据库之前,ArithAbort被设置为关闭,现在我们正在尝试强制将其保持为“ON”。
我们查看了: Linq to SQL发出的“SET”语句如何控制 但似乎EF4在每次查询之前都会重置连接,因此这不起作用。
到目前为止,我们已经尝试在给定查询之前使用“set ArithAbort on”,但没有成功。我们还尝试了长路走,创建一个新连接并在其中设置它,但仍然没有运气。
那么,有人知道如何在针对数据库进行任何linq查询之前设置它吗?
更改数据库设置不是选项。
编辑: 根据Andiihs的建议,我尝试了包装器解决方案,并向EFCachingCommand类中添加了以下代码行。
这基本上确保了任何Linq-sql调用都会以正确的设置语句为前缀。
我还需要添加:
为了使EFCachingCommandDefinition中的GetAffectedEntitySets函数能够与存储过程调用正常工作。
我们查看了: 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函数能够与存储过程调用正常工作。