我正在尝试Dapper。我喜欢到目前为止所看到的。为了做简单的CRUD,我使用Dapper.rainbow。它工作得很好。但是,仅当表具有名称为 Id 的标识列时,它才有效。有这样的db是有意义的,但我不能要求在数据库中更改列名只是为了使用Dapper。为了更清楚,我正在使用像Northwind Db这样的数据库。它在Id列中重复了表名。
为了解决这个问题,我更改了Dapper.Rainbow代码如下:
public T Get(TId id,string idColumnName="Id")
{
return database.Query<T>("select * from " + TableName + " where "+idColumnName+" = @id", new { id }).FirstOrDefault();
}
有没有更好的方法来处理这些,如列映射/注释或完全不同的东西?
我读过像这样的问题
Manually Map column names with class properties
Dapper.Rainbow VS Dapper.Contrib
(我遇到了与Dapper.Contrib类似的小问题,我会另外问一下。)
更新 - 不确定这些答案是否适用于我的Dapper.Rainbow问题(至少,我不知道如何)。
提前感谢您的帮助!
答案 0 :(得分:7)
我有类似的问题。现有的Dapper扩展不符合我的理想模式。我希望简单的CRUD操作具有智能默认值而无需额外的任何操作。我还想让模型具有未直接映射到数据库的其他属性。例如 - 在其getter中组合FirstName和LastName的FullName属性 - 而不是将FullName添加到Insert和Update语句中。
我希望主键列在大多数情况下都是Id,但允许覆盖属性。
最后,我希望表名默认匹配类名,但允许覆盖属性。
我最终编写了自己的Dapper扩展来解决这些问题。它在Github和Nuget上。希望它对你有所帮助。