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メソッドなんでしょうけど
良く分かりません。
そもそも無理なのかもしれないけど・・・
なにか分かればまた書きます。