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 }

何时使用该功能

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

时间: 2024-11-01 18:22:52

Entity Framework 6 暂停重试执行策略的相关文章

Entity Framework数据库初始化四种策略

策略一:数据库不存在时重新创建数据库 复制内容到剪贴板 程序代码 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testContext>()); 策略二:每次启动应用程序时创建数据库 复制内容到剪贴板 程序代码 Database.SetInitializer<testContext>(new DropCreateDatabaseAlways<testContext>())

Entity Framework 在MySQL中执行SQL语句,关于参数问题

在Entity Framework中添加MySQL模型,在写代码的过程中需要直接执行SQL语句. 在SQL语句中用到了@curRank := 0 这样在SQL语句中定义参数,同时还会有传入参数:ai.action_time >= '@startTime', 在执行的过程中会报错. 解决办法,在连接数据库字符串中添加:';Allow User Variables=True' 添加完成后如下: <add name="" connectionString="metada

Entity Framework 数据库初始化四种策略

策略一:数据库不存在时重新创建数据库 1 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testContext>()); 策略二:每次启动应用程序时创建数据库 1 Database.SetInitializer<testContext>(new DropCreateDatabaseAlways<testContext>()); 策略三:模型更改时重新创建数据库 1 Dat

MVC5 Entity Framework学习之弹性连接和命令拦截

到目前为止,应用程序一直在本地IIS Express上运行.如果你想让别人通过互联网访问你的应用程序,你必须将它部署到WEB服务器同时将数据库部署到数据库服务器 本篇文章中将教你如何使用在将你的应用程序部署到云环境时的Entity Framework 6的非常有价值的两个特性:弹性连接(瞬时错误的自动重试)和命令拦截(捕获所有发送到数据库的SQL查询语句并记录至日志中). 1.启用弹性连接 当你将应用程序部署到Windows Azure时,相应的数据库部也应被部署到Windows Azure S

[Entity Framework] Dababase First, Model 与 Table 的更新策略

在初次使用EF的Database first时,总感觉能迅速的从Data Table 快速将Entity Model快速建立出来,省去以往还要hard code撰写POCO类的功夫,但数据表设计随着开发而更新了几个版本后,常常发生Model 与 Table对不起来的情况,即便执行了"从数据库更新模型",不是字段没反映出来.就是出现错误消息,常常最后只能选择全部砍掉重练.... 在初次使用EF的Database first时,总感觉能迅速的从Data Table 快速将Entity Model快速

Entity Framework 6.X实现记录执行的SQL功能

Entity Framework在使用时,很多时间操纵的是Model,并没有写sql语句,有时候为了调试或优化等,又需要追踪Entity framework自动生成的sql(最好还能记录起来,方便出错时排查) 方式一: 通过System.Data.Entity.DataBase.Log属性指定一个无返回值的委托,来实现记录日志的功能 public partial class EFContext<T> : DbContext where T : class { public EFContext(

[翻译] - &lt;Entity Framework&gt; - 直接执行数据库命令

原文:[翻译] - <Entity Framework> - 直接执行数据库命令 纯属学习上的记录, 非专业翻译, 如有错误欢迎指正! 原文地址: http://msdn.microsoft.com/en-us/library/gg715124(v=vs.103) 使用 EF 4.1 或者更新版本, 你可以直接执行任何数据库命令. 在本节介绍的方法允许你对数据库执行原生的 SQL 命令. 通过 SQL 查询语句获取实体对象集 DbSet 类中的 SqlQuery 方法允许你执行一个返回实体对象

Entity Framework Code First执行SQL语句、视图及存储过程

1.Entity Framework Code First查询表或视图 var provincelist = ctx.Provinces.SqlQuery("SELECT TOP 10 * FROM Province"); foreach (var province in provincelist) { Console.WriteLine("{0}-{1}-{2}", province.ProvinceID, province.ProvinceNo, provinc

Entity Framework执行Sql语句返回DataTable

Entity Framework中对外开放了数据库连接字符串,使用的时候可以直接得到这个连接字符串,然后进行相关的操作.如果在使用的过程中,发现Entity Framework中有一些满足不了的需求的话,那么就可以用这个连接字符串,自己写ADO的代码,去数据库进行相关的操作.特别是对于一些复杂的查询,这时候,一般是想直接执行一个Sql语句,返回一个结果集.下面是一个方法,直接返回DataTable. /// <summary> /// EF SQL 语句返回 dataTable /// <