EF6中是否可以使用查询特定的数据库执行策略



Update:问题是我正在评估在构造函数中使用哪种执行策略,而不是将其留在lambda中。换句话说,我在MyConfiguration的构造函数中有这个。。。

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

而不是在λ的内部具有该求值

原始问题:在Entity Framework 6.0中,是否有任何方法可以让一些对DbContext的查询使用一种执行策略,而另一些则使用不同的执行策略?我在微软的文档中看到了下面的例子。

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
}

问题是我正在评估在构造函数中使用哪种执行策略,而不是将其留在lambda中。换句话说,我在MyConfiguration的构造函数中有这个。。。

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

而不是在λ的内部具有该求值。这是一个微妙的区别,但当它被实际评估时(在构建和使用时(,它会发生变化。

最新更新