在SQL Azure中使用实体框架

我正在为Windows Azure编写一个应用程序。 我正在使用实体框架来访问SQL Azure。 由于SQL Azure中的限制和其他机制,如果SQL语句失败,我需要确保我的代码执行重试。 我试图想出一个坚实的方法来做到这一点。

(在下面的代码中,ObjectSet返回我的EFContext.CreateObjectSet())

比方说,我有这样的功能:

  public Product GetProductFromDB(int productID)
  {
     return ObjectSet.Where(item => item.Id = productID).SingleOrDefault();
  }

现在,这个函数不会重试,并且在SQL Azure中迟早会失败。 一个天真的解决方法是做这样的事情:

  public Product GetProductFromDB(int productID)
  {
     for (int i = 0; i < 3; i++)
     {
        try
        {
           return ObjectSet.Where(item => item.Id = productID).SingleOrDefault();
        }
        catch
        {

        }
     }
  }

当然,这有几个缺点。 无论SQL失败,我都会重试(如果它是主键违例,重试会浪费时间),我会立即重试,不会有任何暂停,等等。

我的下一步是开始使用Microsoft的瞬态故障处理库。 它包含RetryPolicy,它允许我从实际的查询代码中分离重试逻辑:

  public Product GetProductFromDB(int productID)
  {
     var retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(5);

     var result = _retryPolicy.ExecuteAction(() =>
        {
           return ObjectSet.Where(item => item.Id = productID).SingleOrDefault;
        });

     return result;
  }

上面的最新解决方案被描述为http://blogs.msdn.com/b/appfabriccat/archive/2010/10/28/best-practices-for-handling-transient-conditions-in-sql-azure-client- applications.aspx处理SQL Azure客户端应用程序中的瞬态条件的最佳实践(高级使用模式部分)。

虽然这是向前迈出的一步,但我仍然需要记住,只要我想通过实体框架访问数据库,就可以使用RetryPolicy类。 在一个由几个人组成的团队中,这是一件容易错过的事情。 此外,我认为上面的代码有点麻烦。

我想要的是一种强制执行的方式,始终使用重试。 Transient Fault Handling库包含一个名为ReliableSQLConnection的类,但是我找不到在Entity Framework中使用它的方法。

对这个问题有什么好的建议?


在上述评论之后,Microsoft创建了瞬态故障处理库,该库“包括直接支持通过ReliableSqlConnection类与SQL Azure协同工作”。

http://msdn.microsoft.com/en-us/library/hh680899(v=pandp.50).aspx

大多数希望使用Azure的开发人员都会发现上述内容非常有帮助。


如果你使用实体框架6(目前是alpha版),那么Azure SQL数据库的暂时重试有一些新的内置支持(有一点配置):http://entityframework.codeplex.com/wikipage?title=连接%20Resiliency%20Spec

我创建了一个库,允许您配置实体框架使用故障处理模块进行重试,而无需更改每个数据库调用 - 通常您只需更改配置文件以及可能的一两行代码即可。

这使您可以将它用于Entity Framework <v6或Linq To Sql。

https://github.com/robdmoore/ReliableDbProvider

链接地址: http://www.djcxy.com/p/90223.html

上一篇: Using Entity Framework with SQL Azure

下一篇: EF "Model First": Create entity in edmx and db