EF6引入一個彈性連接的功能,也就是允許重新嘗試執行失敗的資料庫操作。某些複雜的場景中,可能需要啟用或停用重試執行的策略,但是EF框架暫時尚未提供直接的設置開關,將來可能會加入這種配置。幸運的是,很容易自己實現該設置功能。 最簡單的註冊執行策略的方法是通過基於代碼的配置。下麵代碼是一個典型的配置類, ...
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 }
何時使用該功能
最常見的場景是某些操作我們不需要重試執行,例如用戶初始化事務。