Frameworks 实体框架处理连接丢失

Frameworks 实体框架处理连接丢失,frameworks,entity,Frameworks,Entity,我们的应用程序使用EF 5和c#.net 4.5。由于我们的应用程序在世界各地与一台中央服务器一起使用,因此我们遇到超时和与服务器失去连接的问题 当前,我们捕获SaveChanges()方法并重试,直到用户取消。对于代码中的各种加载,我们能做些什么 编辑:我尝试了建议的解决方案,但无法正常工作: public class MyRetryStrategy : ITransientErrorDetectionStrategy { public bool IsTransient(Excepti

我们的应用程序使用EF 5和c#.net 4.5。由于我们的应用程序在世界各地与一台中央服务器一起使用,因此我们遇到超时和与服务器失去连接的问题

当前,我们捕获SaveChanges()方法并重试,直到用户取消。对于代码中的各种加载,我们能做些什么

编辑:我尝试了建议的解决方案,但无法正常工作:

public class MyRetryStrategy : ITransientErrorDetectionStrategy
{
    public bool IsTransient(Exception ex)
    {
        if (ex != null && ex is SqlException)
        {
            foreach (SqlError error in (ex as SqlException).Errors)
            {
                switch (error.Number)
                {
                    case 1205:
                        System.Diagnostics.Debug.WriteLine("SQL Error: Deadlock condition. Retrying...");
                        return true;

                    case -2:
                        System.Diagnostics.Debug.WriteLine("SQL Error: Timeout expired. Retrying...");
                        return true;

                    case -1:
                        System.Diagnostics.Debug.WriteLine("SQL Error: Timeout expired. Retrying...");
                        return true;
                }
            }
        }

        if (ex != null && ex is EntityException)
        {
            ex = ex.InnerException;
            foreach (SqlError error in (ex as SqlException).Errors)
            {
                switch (error.Number)
                {
                    case 1205:
                        System.Diagnostics.Debug.WriteLine("SQL Error: Deadlock condition. Retrying...");
                        return true;

                    case -2:
                        System.Diagnostics.Debug.WriteLine("SQL Error: Timeout expired. Retrying...");
                        return true;

                    case -1:
                        System.Diagnostics.Debug.WriteLine("SQL Error: Timeout expired. Retrying...");
                        return true;
                }
            }
        }

        // For all others, do not retry.
        return false;
    }
}
Enity框架只抛出EntityExceptions,所以我添加了第二个代码路径

实际使用情况:

  RetryPolicy policy = new RetryPolicy<MyRetryStrategy>(5, TimeSpan.FromMilliseconds(1000));
        policy.ExecuteAction(()=>_context.ProductStatuses.Include(x => x.Name.Translations).Load());
RetryPolicy policy=new RetryPolicy(5,TimeSpan.frommicles(1000));
policy.ExecuteAction(()=>_context.productstatus.Include(x=>x.Name.Translations.Load());
MyRetryStrategy中的IsTransient方法永远不会被调用,也不会调用重试。我在通话前停止了数据库测试


我做错了什么

这个样本让我大开眼界

iSeries(如下)是您自己的自定义实现

private static void RetryPolityUsingCode(IUnityContainer container, IService service, OutputWriterService writer)
       {
           writer.WriteLine("Begin sample: RetryPolityUsingCode");
           // Define your retry strategy: retry 5 times, starting 1 second apart
           // and adding 2 seconds to the interval each retry.
           var retryStrategy = new Incremental(5, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));

           // Define your retry policy using the retry strategy and the Windows Azure storage
           // transient fault detection strategy.
           var retryPolicy = new RetryPolicy<MyRetryStrategy >(retryStrategy);


           try
           {
               // Do some work that may result in a transient fault.
               retryPolicy.ExecuteAction(service.AMethodIDefinedInMyService);
           }
           catch (Exception exception)
           {
               // All the retries failed.
               writer.WriteLine("An Exception has been thrown:\n{0}", exception);
           }
           writer.WriteLine("End sample: RetryPolityUsingCode");
       }
private static void RetryPolityUsingCode(IUnityContainer容器、iSeries服务、OutputWriterService编写器)
{
WriteLine(“开始示例:retrypolitiyusingcode”);
//定义重试策略:重试5次,间隔1秒开始
//并在每次重试的间隔上增加2秒。
var retryStrategy=新增量(5,TimeSpan.FromSeconds(1),TimeSpan.FromSeconds(2));
//使用重试策略和Windows Azure存储定义您的重试策略
//瞬态故障检测策略。
var retryPolicy=新retryPolicy(retryStrategy);
尝试
{
//进行一些可能导致瞬时故障的工作。
retryPolicy.ExecuteAction(service.definedmyservice);
}
捕获(异常)
{
//所有的重试都失败了。
WriteLine(“已引发异常:\n{0}”,异常);
}
writer.WriteLine(“结束示例:retrypolitiyusingcode”);
}