2013年1月11日金曜日

TryAndError Appharbor でEntityDataModelを使用する

AppharborでEntityDataModelを使用する際にはまったポイントについてつらつらと書いていきます。

1.DateTime型を使ったらエラーで怒られる
これはAppharborとは関係ないが、モデルでDatetime型の項目を使用していると登録時に「Datetime2 データ型から datetime データ型への変換の結果、範囲外の値になりました」というエラーが出る

原因はよくわからんが、Nullを許可するDatetime?型だとこれを回避できるらしい(VB.NETだとNullable)。

2.DBが最新でないみたいなエラーが起きる
モデルを変更後、マイグレーションをしていないとこのエラーが起こる。

The model backing the 'YourContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

マイグレーションの方法は こちら 参考。EntityDataModelインストール済みなら以下のコマンドを打てばいい。

Add-Migration マイグレーション名
Update-Database 


3.本番であるAppharborと開発環境でConnectionStringを変えたい
これにはWeb.Release.Configを使用する。デフォルトで作成されているので中身を見れば記入方法は分かるが、Release環境時にWeb.Configの値を置き換えることが可能。

 <add name="MyDB" connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
  xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>

ポイントは青字部分で、これでWeb.Config上のnameが一致するものを置き換えてくれる。


4.テストプロジェクトがあるがデプロイ時自動で走るのでこれをやめたい
Appharborへデプロイする際は、テストプロジェクトがあるときそれが実行される。これはこれでいいのだが、DBへアクセスするテストがある場合有難迷惑なのでデプロイ時テストプロジェクトをはずしたいことがある。

こうしたときは、既存のソリューションファイル(.sln)をコピーし Appharbor.sln というファイルを作成し、これを編集しテストプロジェクトを除外する。

Appharbor上では、Appharbor.slnがあればそちらが優先される。


5.ProviderManifestTokenから文字列が返されませんでしたエラーが出る
EntityDataModelはデフォルトでデータベースの作りかえを行うが、普通Appharbor上で使用するDBのアドオンでそんなこと許されるわけないので、DBの作り返しを行わないよう、Global.aspxのApplication_Start でInitializorの設定を行う。

Database.SetInitializer<YourContext>(new CreateDatabaseIfNotExists<YourContext>());

CreateDatabaseIfNotExistsが肝。あとは、ConnectionString aliasにconnectionStringのnameを設定しておく。

とりあえずこれで解決した。こちらのサポートのやり取りを参照。



まだ追記するかもしれないが、とりあえずこれくらいか・・・。こういうところはさくっと行ってほしいんだがな~


0 件のコメント:

コメントを投稿