我们的 EF4 MVC 解决方案存在一些性能问题。我们已经能够追踪到 ArithAbort 在所有与数据库的连接之前被设置为关闭,现在我们正在尝试强制它保持“打开”状态。
我们研究过:如何控制 Linq to SQL 发出的“SET”语句
但 EF4 似乎会在每次查询之前重置连接,因此这不起作用。
到目前为止,我们已经尝试在给定查询之前“设置 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 调用都以正确的 set 语句为前缀。
我还必须补充:
DbFunctionCommandTree functionTree = commandTree as DbFunctionCommandTree;
if (functionTree != null)
{
this.IsModification = true;
return;
}
到EFCachingCommandDefinition 中的GetAffectedEntitySets 函数,以便使其能够与存储过程调用一起正常工作。