2010年9月15日水曜日

SqlMetalでLinq To SQLのマッピング情報を外部ファイル化する

Linq To SQLを使用する際にdbml必要なDBのテーブルをGUI上でD&Dして構築すると、DBとのマッピング情報やソースコードは自動で生成されるので改変できない。しかしSqlMetalを使うと、マッピング情報をマッピングファイルとして外部ファイル化したり、生成されるクラスに指定の名前空間や基底クラスを付与したりと色々細かい操作行えるようになる。

SqlMetalはVisual Studioをインストールするとついてくるコマンドラインツールで、初期では下記にある。
drive:\Program Files\Microsoft SDKs\Windows\vn.nn\bin

ここでいくつか使い方をみてみよう。

DBの環境は下記の通り:
SQL Server名: .\SQLSERVER2008R2
UID: sa
PWD: password
DB: TestDB

SqlMetal /server:.\SQLSERVER2008R2 /database:TestDB /user:sa /password:password /code:"C:\MatsuoSoftware\TestDB.cs" /map:"C:\MatsuoSoftware\TestDB.map" /serialization:Unidirectional /context:TestDBDataContext /namespace:MatsuoSoftware.Data /sprocs /functions

/server, /database, /user, /passwordはDBへの接続情報。/code, /mapで出力先と出力方法を指定する。ここで/dbmlを指定することも可能だが、その場合は/code, /mapオプションとは一緒に使えない。dbmlで出力するか、csファイルとmapファイルで出力するかの二択だ。/serializationでシリアル化の方法を指定する。Unidirectionalを指定するとDataContract, DataMember属性が生成されるクラス、プロパティに付与されるのでWCFサービスの戻り値や引数としてそのまま使用することが可能になる。/context, /namespaceは見ての通りだ。/sprocs, /functionsでストアドプロシージャと関数も出力に含めるよう指定している。

他にも基底クラスを指定する/entitybaseなどがあるので下記を参考に自分の目的にあったオプションを見つけて欲しい。

SqlMetal.exe (Code Generation Tool)

最後に、マッピングファイルの読み込み方法で苦労したので参考までに紹介しておく。

Assembly assembly = Assembly.GetExecutingAssembly();
var stream = assembly.GetManifestResourceStream("TestDB.map");
XmlMappingSource mappingSource = XmlMappingSource.FromStream(stream);
return new TestDBDataContext(connectionString, mappingSource);

マッピングファイルのビルドアクションをResourceにしてからでないとなぜだか読み込めなかったのでGetManifestResourceStreamを使用している。

0 件のコメント:

コメントを投稿