Entity Framework 6 暂停重试执行策略
EF6引入一个弹性连接的功能,也就是允许重新尝试执行失败的数据库操作。某些复杂的场景中,可能需要启用或停用重试执行的策略,但是EF框架暂时尚未提供直接的设置开关,将来可能会加入这种配置。幸运的是,很容易自己实现该设置功能。
最简单的注册执行策略的方法是通过基于代码的配置。下面代码是一个典型的配置类,启用SqlAzureExecutionStrategy策略(允许重试执行SQL Azure中已知的可重试异常)。
1 using System.Data.Entity; 2 using System.Data.Entity.SqlServer; 3 4 namespace Demo 5 { 6 public class MyConfiguration : DbConfiguration 7 { 8 public MyConfiguration() 9 { 10 this.SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy()); 11 } 12 } 13 }
允许挂起执行策略
设置完新的执行策略后,所有的操作都会遵循新的执行策略。我们可以实现一个标志参数,在默认(不重试)和SqlAzureExecutionStrategy之间进行切换。
注意:我们通过CallContext获取或设置该标志,这可以确保我们的操作在EF6中的异步查询、保存中正确。
1 using System.Data.Entity; 2 using System.Data.Entity.Infrastructure; 3 using System.Data.Entity.SqlServer; 4 using System.Runtime.Remoting.Messaging; 5 6 namespace Demo 7 { 8 public class MyConfiguration : DbConfiguration 9 { 10 public MyConfiguration() 11 { 12 this.SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy 13 ? (IDbExecutionStrategy)new DefaultExecutionStrategy() 14 : new SqlAzureExecutionStrategy()); 15 } 16 17 public static bool SuspendExecutionStrategy 18 { 19 get 20 { 21 return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false; 22 } 23 set 24 { 25 CallContext.LogicalSetData("SuspendExecutionStrategy", value); 26 } 27 } 28 } 29 }
使用上面标志
现在就可以使用该标志禁用在某些操作上禁用“重试执行策略”。
1 using (var db = new BloggingContext()) 2 { 3 MyConfiguration.SuspendExecutionStrategy = true; 4 5 // Perform without retry logic 6 db.Blogs.Add(new Blog { Url = "romiller.com" }); 7 db.SaveChanges(); 8 9 MyConfiguration.SuspendExecutionStrategy = false; 10 11 }
何时使用该功能
最常见的场景是某些操作我们不需要重试执行,例如用户初始化事务。