Возможны ли специфичные для запроса DbExecutionStrategies в EF6? - PullRequest
0 голосов
/ 08 ноября 2018

Обновление : Проблема заключалась в том, что я оценивал, какую стратегию выполнения использовать в конструкторе, а не оставлять ее в лямбда-выражении. Другими словами, у меня было это внутри конструктора MyConfiguration ...

var strategy = SuspendExecutionStrategy 
    ? (IDbExecutionStrategy)new DefaultExecutionStrategy()
    : new SqlAzureExecutionStrategy());
this.SetExecutionStrategy("System.Data.SqlClient", () => strategy);

вместо этой оценки внутри лямбда.

Оригинальный вопрос: Есть ли способ в Entity Framework 6.0, чтобы некоторые запросы к DbContext использовали одну стратегию выполнения, а другие - другую? Я вижу приведенный ниже пример в документации Microsoft .

public class MyConfiguration : DbConfiguration
{
    public MyConfiguration()
    {
        this.SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
          ? (IDbExecutionStrategy)new DefaultExecutionStrategy()
          : new SqlAzureExecutionStrategy());
    }

    public static bool SuspendExecutionStrategy
    {
        get
        {
            return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy")  false;
        }
        set
        {
            CallContext.LogicalSetData("SuspendExecutionStrategy", value);
        }
    }
}

К сожалению, в моем тестировании, похоже, что если я создаю несколько экземпляров моего класса DbContext , то только один вызов конструктора DbConfiguration с этим одноэлементным объектом конфигурации становится общим для всех объекты контекста. Поэтому, хотя я мог установить это при запуске с SuspendExecutionStrategy , я не мог изменить его во время выполнения. Я предполагаю, что последующие вызовы SetExecutionStrategy () могли бы изменить его, но у меня есть несколько потоков, и я хотел бы, чтобы некоторые использовали один DbExecutionStrategy , а другие использовали другой (специально для повторяющихся против неповторяющихся запросов).

Есть ли где-нибудь настройка, которая могла бы изменить DbConfiguration , чтобы он не был единичным для класса и вместо этого был специфичным для конкретного экземпляра DbContext ? Или я что-то неправильно понимаю?

В идеале я бы хотел сделать что-то вроде ...

using(var repo = new MyDbContext()){
    repo.SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
    // do some queries to my repository
}

в одном потоке, а затем в другом, есть

using(var repo = new MyDbContext()){
    repo.SetExecutionStrategy("System.Data.SqlClient", () => (IDbExecutionStrategy)new DefaultExecutionStrategy());
    // do some queries to my repository
}

1 Ответ

0 голосов
/ 12 ноября 2018

Проблема заключалась в том, что я оценивал, какую стратегию выполнения использовать в конструкторе, а не оставлять ее в лямбде. Другими словами, у меня было это внутри конструктора MyConfiguration ...

var strategy = SuspendExecutionStrategy 
    ? (IDbExecutionStrategy)new DefaultExecutionStrategy()
    : new SqlAzureExecutionStrategy());
this.SetExecutionStrategy("System.Data.SqlClient", () => strategy);

вместо того, чтобы иметь эту оценку внутри лямбды. Это тонкое различие, но оно меняется, когда оно действительно оценивается (в построении по сравнению с использованием).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...