23

dapper-dot-net で属性を使用して、プロパティ名ではなく使用する列名を指定する方法はありますか?

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; }
}

プロパティに任意の名前を付けられるようにしたいと考えています。私たちのデータベースには一貫した命名規則がありません。

ダッパーを使用しない場合、追加の同様のオプションはありますか?

4

4 に答える 4

26

Dapper-Extensionsも確認できます 。

Dapper Extensions は、POCO に基本的な CRUD 操作 (Get、Insert、Update、Delete) を追加することで 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 });
于 2012-08-29T18:45:09.343 に答える
20

selectステートメントを直接またはプロシージャで使用している場合は、列にエイリアスを付けることができます。

SELECT code as Value FROM yourTable
于 2012-08-29T17:41:04.420 に答える
4

もう 1 つの方法は、動的な結果を手動でマッピングすることです。

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 レコードセットからプロパティに移動するために必要なことは何でも行うだけです。

于 2013-08-25T14:54:35.433 に答える
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; }
    }
于 2013-02-01T07:45:58.787 に答える