4

我们的 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 函数,以使其与存储过程调用一起正常工作。

4

1 回答 1

4

EF 提供了在实体连接和 SQL.Data.Client 之间插入包装提供程序的能力 - 请参阅http://code.msdn.microsoft.com/EFProviderWrappershttp://blogs.msdn.com/b/jkowalski/archive/ 2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx

现在我承认这更像是一个线索而不是一个答案 - 但也许你可以在这一点上插入相关的集合?

于 2011-06-15T11:24:50.597 回答