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 }

何时使用该功能

最常见的场景是某些操作我们不需要重试执行,例如用户初始化事务。

posted @ 2016-04-25 08:42  一飞·张  阅读(877)  评论(0编辑  收藏  举报