我正在一个宠物项目上试验Dapper 。我正在使用SQLite运行所有测试,并使用 MySql 进行“生产”。但是我不确定如何最好地使用 Dapper 来处理与数据库无关的情况。
我遇到的特殊问题是 MySql不支持主键的 Guid 类型,因此我使用varchar(40)作为类型(SQLite 支持作为 guid 的唯一标识符)。所以问题来了,如果我有一个如下的通用存储库,我在尝试从 MySql 数据库中选择时会遇到麻烦。因为 Id 属性的类型是 Guid,Dapper 会抛出“ Error parsing column 10 ”,因为 varchar 类型与 guid 类型不匹配。
如果我将 Id 属性从 guid 更改为 int,那么 GetById 中的原始 sql 将更加棘手,我什至不知道如何编写。它将类似于,1. 开始事务,2. 插入,3. 选择最后插入的 id 并返回它。如果数据库类型是 mysql,那么我将使用last_insert_id,或者如果它是 sqlite 则使用last_insert_rowid?因为原始 sql 语法会因数据库而异...
public IEnumerable<T> GetById(Guid id) //convention: Id is always of type Guid.
{
return UnitOfWork.DbConnection.Query<T>(
string.Format(
"select * from {0} where Id = @Id", typeof (T).Name), new {Id = id});
}
其他示例是限制返回的行数(尤其是分页)等等。那么我将如何使用 dapper 编写与数据库无关的原始 sql 查询呢?也许在我的情况下,Dapper 不适合?也许我应该在这里使用相同的旧 NHibernate。有什么建议么?我做错了吗?谢谢!