ORMモドキ作成 (5)
前に作っていたORMモドキなんですが、ちょっと問題を見つけてしまいました(´・ω・`)
何が問題かというと、DTOのクラス/プロパティ名と、DB上のテーブル/フィールド名のマッチングについてです。
今回は.NETとDBの銘々対応ルールとして、AaaBbbCcc(.NET)←変換→aaa_bbb_ccc(DB)のようなStrategyを使用していたんですが。
このStrategyだと、アルファベット以外が区切りの先頭に来たときに困るんですよね(´ω`)
例えばフィールド名aaa_bbb1とaaa_bbb_1の両方がプロパティAaaBbb1になってしまうので、名称からSQL文を構築する際に対応できなくなってしまうと言うことです。
で、仕方ないんで以下の様なAttributeクラスを作ってみたりして。
DTOのクラス/プロパティ名とDB上のテーブル/フィールド名がマッチングできない場合に、DTOクラスで明示的にDB上の名称を指定するための属性ですね。
// クラス-テーブルマッピング用 [AttributeUsage(AttributeTargets.Class)] public class TableNameAttribute : Attribute { private string name; public string Name { get { return( this.name ); } } public TableNameAttribute() { } public TableNameAttribute(string name) { this.name = name; } }
// プロパティ-フィールドマッピング用用 [AttributeUsage(AttributeTargets.Property)] public class FieldNameAttribute : Attribute { private string name; public string Name { get { return( this.name ); } } public FieldNameAttribute() { } public FieldNameAttribute(string name) { this.name = name; } }
使用例はこんな感じです。
[TableName("foo")] public class HogeDTO { private int id; private string data; [PrimaryKey] public int Id { get { return( this.id ); } set { this.id = value; } } [FieldName("bar")] public string Data { get { return( this.data ); } set { this.data = value; } } }
メタ情報としてSQL文を作る際に、TableNameAttributeやFieldNameAttributeが指定されている項目については、そのNameプロパティから作成するようにしてみました。
例えばこの例だと、属性無しの時には「SELECT id, data FROM hoge」みたいなSQL文が生成されますが、属性があると「SELECT id, bar FROM foo」の様なSQLを生成するようになっています。
まあ、結局今回はDBの方の名称を変更すると言うことで、このAttributeは使わないことにしたんですけどね。
お手軽O/Rマッパーモドキを変に機能強化しても分かりづらいかもしれないし、CoCということで(´ω`)
ちなみにこのO/Rマッパーモドキ、どのご家庭にもあるものを作成するためのシステムで利用される予定だったりしますけど(・∀・)