C# 企业库5中的RetryPolicy不起作用

C# 企业库5中的RetryPolicy不起作用,c#,entity-framework,enterprise-library,azure-sql-database,C#,Entity Framework,Enterprise Library,Azure Sql Database,我正在开发一个小应用程序,将大量数据从一个数据库翻译和导入到另一个数据库。为了做到这一点,我使用实体框架和一些自定义扩展一次提交一个页面上的项目,批量大约1000个。由于这可能需要一段时间,我还想确保整个事情不会因为连接在运行时出现打嗝而停止 我选择了瞬态故障处理应用程序块(EnterpriseLibrary5.0的一部分),如下所示(参见案例2:事务范围的重试策略)。下面是一个以ObjectContext扩展形式实现的示例,该扩展只需将对象添加到上下文并尝试保存它们,使用的重试策略主要关注Sq

我正在开发一个小应用程序,将大量数据从一个数据库翻译和导入到另一个数据库。为了做到这一点,我使用实体框架和一些自定义扩展一次提交一个页面上的项目,批量大约1000个。由于这可能需要一段时间,我还想确保整个事情不会因为连接在运行时出现打嗝而停止

我选择了瞬态故障处理应用程序块(EnterpriseLibrary5.0的一部分),如下所示(参见案例2:事务范围的重试策略)。下面是一个以ObjectContext扩展形式实现的示例,该扩展只需将对象添加到上下文并尝试保存它们,使用的重试策略主要关注Sql Azure内容:

public static void AddObjectsAndSave<T>(this ObjectContext context, IEnumerable<T> objects)
    where T : EntityObject
{
    if(!objects.Any())
        return;

    var policy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>
        (10, TimeSpan.FromSeconds(10));
    var tso = new TransactionOptions();
    tso.IsolationLevel = IsolationLevel.ReadCommitted;

    var name = context.GetTableName<T>();

    foreach(var item in objects)
        context.AddObject(name, item);


    policy.ExecuteAction(() =>
    {
        using(TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, tso))
        {
            context.SaveChanges();

            ts.Complete();
        }
    });
}
publicstaticvoid AddObjectsAndSave(此ObjectContext上下文,IEnumerable对象)
其中T:EntityObject
{
如果(!objects.Any())
返回;
var policy=new RetryPolicy
(10,时间跨度从秒(10));
var tso=新的TransactionOptions();
tso.IsolationLevel=IsolationLevel.ReadCommitted;
var name=context.GetTableName();
foreach(对象中的变量项)
context.AddObject(名称、项);
策略执行(()=>
{
使用(TransactionScope ts=新TransactionScope(TransactionScopeOption.Required,tso))
{
SaveChanges();
ts.完成();
}
});
}

这段代码工作得很好,直到我通过在Sql Server运行时暂停本地实例来测试重试策略。它几乎立刻便会大便,这很奇怪。您可以看到,我已将策略配置为每隔10秒重试一次;要么忽略间隔,要么未能捕获错误。我怀疑是后者,但我是新手,所以我真的不知道。

我怀疑SqlAzureTransientErrorDetectionStrategy不包括您正在模拟的错误。此策略实现SQL Azure引发的特定错误。查看此代码以找出此策略实现了哪些错误:


要处理您试图捕获的错误,您可以通过实现ITransientErrorDetectionStrategy接口来实现自己的策略