我们的 EF4 MVC 解决方案存在一些性能问题。我们已经能够追踪到 ArithAbort 在与数据库的所有连接之前设置为关闭,现在我们正试图强制它保持为“开启”。
我们看过: 如何控制 Linq to SQL 发出的“SET”语句
但似乎 EF4 在每次查询之前都重置了连接,所以这不起作用。
到目前为止,我们已经尝试在给定查询之前“设置 ArithAbort”,但没有成功。我们还尝试过很长的路要走,并在我们设置它的地方建立新的连接,但仍然没有运气。
那么,任何人都知道我们如何在对数据库进行任何 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 函数,以使其与存储过程调用一起正常工作。