问题描述
|
EF4 MVC解决方案存在一些性能问题。我们已经能够追踪到ArithAbort在与数据库的所有连接之前被设置为关闭状态,现在我们正试图迫使它保持为“ ON”状态。
我们已经看过:
如何控制Linq向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函数与存储过程调用一起正常工作。
解决方法
EF提供了在实体连接和SQL.Data.Client之间插入包装提供程序的功能-请参阅http://code.msdn.microsoft.com/EFProviderWrappers和http://blogs.msdn.com/b/jkowalski/archive/ 2009/06/11 /在实体框架中跟踪和缓存实体框架中的msdn-code-gallery.aspx
现在,我承认这更多的是线索,而不是答案-但也许您可以在此时插入相关的集合?