управление ArithAbort в EF4 - PullRequest
4 голосов
/ 14 июня 2011

У нас возникли некоторые проблемы с производительностью нашего решения EF4 MVC.Мы смогли отследить его до отключения ArithAbort перед всеми подключениями к базе данных, и теперь мы пытаемся заставить его оставаться включенным.

Мы рассмотрели: Как вы управляете инструкциями "SET", выдаваемыми Linq для SQL

Но похоже, что EF4 сбрасывает соединение перед каждым запросом, так что это не будет работать.

До сих пор мы пытались "включить ArithAbort" перед заданным запросом, но безуспешно.Мы также пытались проделать долгий путь и создать новое соединение там, где мы его установили, но все равно не повезло.

Итак, у любого есть ключ к пониманию того, как мы можем установить его, прежде чем делать какие-либо ссылки.запросы к базе данных?

Изменение настроек базы данных не вариант.

Редактировать: По предложению 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;
    }

В функцию GetActedEntitySetsв EFCachingCommandDefinition, чтобы заставить его работать должным образом с вызовами хранимых процедур.

1 Ответ

4 голосов
/ 15 июня 2011

EF предоставляет возможность вставлять провайдер обтекания между Entity Connection и 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

Теперь я признаю, что это скорее подсказка, чем ответ - но, возможно, вы можете вставить соответствующий набор в этот момент?

...