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; }
}
我希望无论我选择什么,都可以为我的房产命名。我们的数据库没有一致的命名约定。
如果没有小巧玲珑,还有其他类似的选择吗?
答案 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; }
}