Dapper micro ORM,数据库不可知和MySql Guid类型

Jef*_*eff 3 c# mysql sqlite orm dapper

我在一个宠物项目上试验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});
}
Run Code Online (Sandbox Code Playgroud)

其他示例是限制返回的行数(特别是对于分页)等等.那我怎么用dapper编写数据库无关的原始sql查询?也许在我的情况下Dapper不合适?也许我应该在这里使用相同的旧NHibernate.有什么建议?我做错了吗?谢谢!

Gbo*_*man 10

尝试使用CHAR(36)作为MySQL中主键的数据类型,这通过MySQl连接器转换为Guid - 我使用的是MySQL连接器版本6.3.4.也适用于Dapper.