MicrosoftのPaaS、Microsoft Azure WebSitesは非常に便利ですが、Service Busなどを用いてスケールアウトする場合はMicrosoft Azure Cloud Serviceを利用する必要があります。
Cloud Serviceでデプロイする際にDB周りでつまずいてしまったので備忘録もかねて記事にします。

要求の処理中にエラーが発生しました。

単純にデプロイしたら、次のようなエラーが発生してしまいました。

dberror

これは、データベースにテーブルがない、もしくは、データベースとのコネクションが取れないために発生しています。

今回はこれを解決します。

リソースをリンクする

Cloud Serviceにデータベースリソースがリンクされていることを確認します。

linkdb

接続文字列のコピー

データベースの接続文字列をコピーします。ADO.NETのものをコピーしましょう。

connection string

Web.Release.configの編集

次にWeb.configを編集しますが、ここで気を付けるのが、ローカルでデバッグするときはローカルのDBを使用したいので、リリース用のWeb.Release.configを編集するということです。

Web.configの横の三角マークをクリックすれば展開されて選択できます。

web.release

Web.Release.configファイルのconfiguration内に以下の設定を追加します。

[xml]
<connectionStrings>
<add name="DefaultConnection"
connectionString="先にコピーした接続文字列(要パスワード挿入)"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
[/xml]

マイグレーションの実行コードの挿入

最後にGlobal.asax.csファイルを次のように編集します。

[csharp]
using System;
using System.Collections.Generic;
using System.Data.Entity.Migrations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace WebRole1
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
var config = new Migrations.Configuration();
var migrator = new DbMigrator(config);
migrator.Update();
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}
[/csharp]

以上で完了です。発行後開始時にマイグレーションが実行されます。

CATEGORIES