我们的EF4 MVC解决方案存在一些性能问题。我们已经能够在所有与数据库的连接之前将其跟踪到ArithAbort设置为关闭,现在我们正试图强制它保持“开启”。
我们看过: How do you control the "SET" statements emitted by Linq to SQL
但似乎EF4正在重置每个查询之前的连接,因此无法正常工作。
到目前为止,我们已尝试在给定查询之前“设置ArithAbort”,但没有运气。我们也尝试了很长的路要走并在我们设置的地方建立新的连接,但仍然没有运气。
那么,在对数据库进行任何linq查询之前,是否有人知道我们如何设置它?
不能更改数据库设置。
编辑: Per 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函数,以使其与存储过程调用一起正常工作。
答案 0 :(得分:4)
EF提供了在实体连接和SQL.Data.Client之间插入环绕提供程序的功能 - 请参阅http://code.msdn.microsoft.com/EFProviderWrappers和http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx
现在我承认这更像是一个线索而不是答案 - 但也许你可以在这一点插入相关的集合?