2012-08-29 3 views
19

dapper-dot-netに属性を使用して、使用する列名を指定し、プロパティ名を指定する方法はありますか?ダッパドットネットマッピングにDB列名を指定できますか?

public class Code 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    // This is called code in the table. 
    public string Value { get; set; } 
    public string Description { get; set; } 
} 

私の選択したプロパティに名前を付けることができます。私たちのデータベースには一貫した命名規則はありません。

dapperを使用していない場合は、同様のオプションがありますか?

+6

'私たちのデータベースには一貫した命名規則はありません。それは災害のための良いレシピです! :)遅かれ早かれ... – walther

答えて

25

Dapper-Extensionsをチェックアウトすることもできます。

Dapperの拡張機能は、あなたのPOCOSのために(削除、挿入、更新を取得します) 基本的なCRUD操作を追加することにより、Dapperのを補完する小さなライブラリです。

カスタムフィールドマッピングを指定できるauto class mapperがあります。たとえば:

public class CodeCustomMapper : ClassMapper<Code> 
{ 
    public CodeCustomMapper() 
    { 
     base.Table("Codes"); 
     Map(f => f.Id).Key(KeyType.Identity); 
     Map(f => f.Type).Column("Type"); 
     Map(f => f.Value).Column("Code"); 
     Map(f => f.Description).Column("Foo"); 
    } 
} 

それからちょうどん:

using (SqlConnection cn = new SqlConnection(_connectionString)) 
{ 
    cn.Open(); 
    var code= new Code{ Type = "Foo", Value = "Bar" }; 
    int id = cn.Insert(code); 
    cn.Close(); 
} 

はあなたのPOCOクラスと同じアセンブリ内のカスタムマップを保持しなければならないことに注意してください。ライブラリはリフレクションを使用してカスタムマップを検索し、1つのアセンブリのみをスキャンします。

更新は:

これでスキャンするアセンブリのリストを登録するSetMappingAssembliesを使用することができます。

DapperExtensions.SetMappingAssemblies(new[] { typeof(MyCustomClassMapper).Assembly }); 
+0

このMapperはどの時点で適用されますか? –

+0

私はちょうど同じことを聞いていた。 ClassMapperを作成しましたが、使用するシステムにどのように登録するのですか?私のコンストラクタは決して呼び出されないので、自動登録ではありません。 – MarqueIV

+0

私は答えを更新しました。 –

18

selectステートメントを直接使用する場合やプロシージャで使用する場合は、列のエイリアスを使用できます。

SELECT code as Value FROM yourTable 
2

選択のために、あなたは、マッピングを実行するために、あなたのクラスにコンストラクタを追加することができます。 コンストラクタのパラメータ名は、テーブルの列と一致する必要があります。

以下はソースの例です。テーブルはクラスに正しくマップされます。

表:

CREATE TABLE #Users (Id int, Name varchar(20)) 

クラス:

class UserWithConstructor 
    { 
     public UserWithConstructor(int id, string name) 
     { 
      Ident = id; 
      FullName = name; 
     } 
     public int Ident { get; set; } 
     public string FullName { get; set; } 
    } 
+0

本当にDapperは、値を具体化するために必要なデフォルトのコンストラクタがないと不平を言ってエラーを投げますか? – Oliver

3

別のアプローチは、単に手動で動的結果でそれをマッピングすることです。

var codes = conn.Query<dynamic>(...sql and params here...) 
       .Select<dynamic,Code>(s=>new Code{Id = s.Id, Type = s.Type, Value = s.code, Description = s.Description}); 

これは明らかに、ダイナミックでクエリを実行しているため、タイプセーフなシナリオが導入されています。また、厄介な列を手動でマップする必要があります。

しかし、私はこのアプローチが好きです。なぜなら、それはとても透明なのでです。必要に応じてキャストすることができます(Enumの場合のように)。基本的には、dbレコードセットからプロパティに移動するために必要な処理をすべて行います。

+0

なぜdownvote? – BlackjacketMack

関連する問題