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; }
}
選択したプロパティに名前を付けられるようにしたいと思います。私たちのデータベースには一貫した命名規則がありません。
Dapperを使用しない場合、同様のオプションは他にありますか?
Dapper-Extensions もチェックアウトできます。
Dapper Extensionsは、POCOの基本的な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 });
Selectステートメントを直接またはプロシージャで使用している場合は、列のエイリアスを作成するだけです。
SELECT code as Value FROM yourTable
もう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});
動的にクエリを実行しているため、明らかにこれにより型安全性のシナリオが導入されます。また、厄介な列を手動でマップする必要があります。
ただし、このアプローチは非常に透明であるため、私はこのアプローチを好む傾向があります。必要に応じてキャストでき(列挙型の場合のように)、基本的には、dbレコードセットからプロパティに移動するために必要なことは何でも実行できます。
選択の場合、クラスにコンストラクターを追加してマッピングを実行できます。コンストラクターのパラメーター名は、テーブルの列と一致する必要があります。
以下はソースからの例です。テーブルはクラスに正しくマップされます。
テーブル:
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; }
}