Обновление : Проблема заключалась в том, что я оценивал, какую стратегию выполнения использовать в конструкторе, а не оставлять ее в лямбда-выражении. Другими словами, у меня было это внутри конструктора 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
}