zoukankan      html  css  js  c++  java
  • 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 }

    何时使用该功能

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

  • 相关阅读:
    POJ1769 Minimizing maximizer(DP + 线段树)
    ZOJ3201 Tree of Tree(树形DP)
    POJ3613 Cow Relays(矩阵快速幂)
    POJ3635 Full Tank?(DP + Dijkstra)
    ZOJ3195 Design the city(LCA)
    POJ3368 Frequent values(RMQ线段树)
    POJ3686 The Windy's(最小费用最大流)
    HDU4871 Shortest-path tree(最短路径树 + 树的点分治)
    POJ3013 Big Christmas Tree(最短路径树)
    Gym100685G Gadget Hackwrench(倍增LCA)
  • 原文地址:https://www.cnblogs.com/from1991/p/5429626.html
Copyright © 2011-2022 走看看