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

本文关键字:MySql Guid 类型 不可知 数据库 micro ORM Dapper | 更新日期: 2023-09-27 18:09:05

我正在一个宠物项目上试验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查询呢?也许以我的情况,戴珀不合适?也许我应该在这里使用旧的NHibernate。有什么建议吗?我做错了吗?谢谢!

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

尝试使用CHAR(36)作为MySQL主键的数据类型,这将由MySQL连接器转换为Guid -我使用MySQL连接器6.3.4版本。

两个问题

  1. 如果你所做的都是单元测试,那么你就不应该首先连接到数据库

  2. 如果你正在做集成(以及任何其他的),为什么你不宁愿在生产DB版本上运行测试,因为一些特殊性可能会使你的测试成功,但生产代码会失败。集成测试应该在与生产类似的配置上运行,否则它们是不相关的。