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

我希望能够为我的属性命名,无论我选择什么。我们的数据库没有一致的命名约定。

如果不使用 dapper,是否还有其他类似的选项?

4

4 回答 4

26

您还可以查看 Dapper-Extensions

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

它有一个自动类映射器,您可以在其中指定自定义字段映射。例如:

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 });
于 2012-08-29T18:45:09.343 回答
20

如果您直接或在过程中使用 select 语句,您可以只为列设置别名。

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

另一种方法是手动将其与动态结果进行映射。

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 记录集到您的属性所需的任何操作。

于 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 回答