我可以为dapper-dot-net映射指定DB列名吗?

时间:2012-08-29 17:22:44

标签: c# database dapper

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 个答案:

答案 0 :(得分:26)

您还可以查看Dapper-Extensions

  

Dapper Extensions是一个小型库,通过添加来补充Dapper   POCO的基本CRUD操作(获取,插入,更新,删除)。

它有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类保持在同一个程序集中。该库使用反射来查找自定义地图,它只扫描一个程序集。

更新

现在可以使用SetMappingAssemblies注册要扫描的程序集列表:

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

答案 1 :(得分:19)

如果您直接使用select语句或在过程中使用,则可以为列添加别名。

SELECT code as Value FROM yourTable

答案 2 :(得分: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});

显然,这会引入类型安全方案,因为您正在查询动态。此外,您必须手动映射无意义的列。

然而,我倾向于喜欢这种方法,因为它是如此透明。你可以根据需要进行投射(如Enums的情况),基本上只需做你需要做的事情就可以从db记录集到你的属性。

答案 3 :(得分: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; }
    }