けさらんぱさらん

方向性は定めず、ただ思いつくままに

Dynamic DataをSqlServer以外で作ってみる

Dynamic DataでさくっとWebアプリを作りたいのですが
DBはSqlServerじゃないんだよね〜ってことはあると思うんですよ
(つ〜か今そうなんですよ)
じゃ〜どうやって作るんでしたっけってことで試してみました。

まずは普通に
プロジェクトの新規作成で
ASP.NET Dynamic Data Linq to Sql Web Application」
を選択します。


SqlServerであればクラス作成でLinq To Sqlクラスを選択して
サーバエクスプローラからD&Dでdbmlファイルを作成するんですが、
SqlServer以外はこうはいきません
今回は、DbLinqというフレームワークを使用します。
DbLinqはこちらからDLしてください。
DBMSはPostgresSql8.4を使用します。
Npgsql.dllへのPathを通しておきます(GACに登録するのが楽かと)
※Mono.Security.dllも必要っぽい


DbLinqは、自動生成をVS上では出来ません。dbmetal.exeを使ってファイルを生成します。

dbmetal /namespace:DynamicDataSample001 /provider:PostgreSql 
/conn:"server=localhost;user id=postgres;  password=hogehoge; database=dbname" /code:SampleDb.cs

dbmetal /namespace:DynamicDataSample001 /provider:PostgreSql 
/conn:"server=localhost;user id=postgres;  password=hogehoge; database=dbname" /dbml:SampleDb.dbml

ここで生成したファイルをプロジェクトに追加します。
dbmlファイルを追加すればcsファイルを自動で読み込まれます。
layoutファイルも自動で生成されます。
dllの参照が足りないのでエラーになります。もろもろのdllを参照してください。


ここまでで通常にLinqクラスとしては動作可能なはずです。


次にDynamicDataで動かすためには、引数なしのコンストラクタが必要です(多分)
なので自動生成されたコードに追加をします(partialを使って別ファイルに書いた方が良いかと)

public CapitalQuiz()
	: base(new Npgsql.NpgsqlConnection(ConfigurationManager.ConnectionStrings["SampleDb"].ToString()),
               new DbLinq.PostgreSql.PostgreSqlVendor())
{
    OnCreated();
}

上記の場合は、Web.configファイルにConnectStringを追加してます。

<connectionStrings>
  <add name="SampleDb" connectionString="Server=127.0.0.1;Port=5432;Database=dbname;User Id=postgres;Password=hogehoge;"/>
</connectionStrings>


で、通常のDynamicDataと同じでGlobal.asaxファイルを変更します。
コメントアウトされている部分をインして一部変更します。

DefaultModel.RegisterContext(typeof(SampleDb), new ContextConfiguration() { ScaffoldAllTables = true });


これでUIも自動生成されるはずなんですけど
実際はエラーになってしまいます。

コンテキスト型 'DynamicDataSample001.SampleDb' はサポートされません。

現状ここで止まっています。
RegisterContextメソッドなんでしょうけど
良く分かりません。
そもそも無理なのかもしれないけど・・・
なにか分かればまた書きます。