しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Entity Framework 6 と SQL Azure をうまく使う、たったひとつの冴えたやりかた

すいません、今回もタイトルを決めるのにホッテントリメーカーを使いました。もう歳なのか、良い感じのタイトルが浮かばなくて困ります。

それはともかくとして、SQL Azure を使ったサービスを作る時にはリトライ処理を追加しておくのは、もはや常識と言っても過言ではないですよね。

今まではこのリトライ処理に Transient Fault Handling Application Block を使うことが基本だったと思うんですが、こないだ RC がリリースされたところの Entity Framework 6 では、フレームワークに SQL Azure 向けのストラテジクラスが追加されているので、これを使えば透過的にリトライを組み込めます。

しかし、デフォルトでは有効になっていないようなので「6 使ってるから大丈夫!」という感じで突っ込むと、多分悲惨なことになると思います。

なので、使う時には以下のように設定をしてあげましょう。

using System.Data.Entity;
using System.Data.Entity.SqlServer;

public class SampleDbConfiguration : DbConfiguration
{
    public SampleDbConfiguration()
    {
        SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
    }
}

このクラスをプロジェクトに追加しておくと、Entity Framework が実行時に自動的に読み込んでくれるので、SQL の実行に使うストラテジクラスを SqlAzureExecutionStrategy に切り替えることが出来るという訳です。

簡単に設定できて良いですね。

ちなみに、Entity Framework 6 より古いバージョンでは NuGet に Reliable Db Provider というパッケージが公開されているので、これを使うと同じように透過的にリトライ処理が組み込めます。

NuGet Gallery | ReliableDbProvider 1.0.0

リトライの処理は Transient Fault Handling Application Block を利用しているようなので安心感がありますね。

くれぐれもコントローラとかにリトライロジックを組み込まないようにしたいものです。