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

时间:2011-09-19 12:43:52

标签: c# mysql sqlite orm dapper

我在宠物项目上试验Dapper。我正在使用SQLite来运行所有测试,使用MySql进行“生产”。但是我不确定如何最好地使用Dapper来处理数据库不可知的情况。

我遇到的特殊问题是MySql,不支持主键的Guid类型,因此我使用 varchar(40)作为类型(SQLite支持)唯一标识符是guid)。所以如果我有一个通用的存储库,问题就出现了,我在尝试从MySql数据库中选择时会遇到麻烦。因为Id属性的类型是Guid,Dapper将抛出“错误解析第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。有什么建议?我做错了吗?谢谢!

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:1)

两个问题

  1. 如果您所做的只是单元测试,那么您根本不应该首先连接到数据库。

  2. 如果您正在进行集成(以及除此之外的任何其他),为什么不在生产数据库版本上运行测试,因为某些特殊性可能会使您的测试成功,但生产代码将失败。集成测试应该在与生产类似的配置上运行,否则它们不相关。

相关问题