Dapper micro ORM,数据库无关和 MySql Guid 类型

Posted

技术标签:

【中文标题】Dapper micro ORM,数据库无关和 MySql Guid 类型【英文标题】:Dapper micro ORM, database agnostic and MySql Guid type 【发布时间】:2011-09-19 12:43:51 【问题描述】:

我在一个宠物项目上试验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。有什么建议么?我做错了吗?谢谢!

【问题讨论】:

支持可扩展类型映射需要对 dapper 进行重大更改,请参阅:code.google.com/p/dapper-dot-net/issues/detail?id=24 我想我需要的可能 Dapper 不合适。但另一方面,我有点讨厌在 NHibernate 中手动进行映射。但我想这是一种权衡。 尝试使用 CHAR(36) 作为 MySQL 中主键的数据类型,这会被 MySQl 连接器转换为 Guid - 我使用的是 MySQL 连接器版本 6.3.4。也适用于 Dapper。 @GboyegaSulaiman 请将其发布为答案,因为这样可以解决问题 【参考方案1】:

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

【讨论】:

完美地帮助了我。谢谢! 你是救生员 :)【参考方案2】:

两个问题

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

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

【讨论】:

对问题 1 的回答:因为我正在编写与 Dapper 一起使用的“原始 sql”,所以我需要一个数据库来测试这些语句。

以上是关于Dapper micro ORM,数据库无关和 MySql Guid 类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dapper micro-orm 的基于令牌的身份验证

What would be the closest equivalent in Java to a Micro ORM such as Dapper, PetaPoco, Massive or Cod

是否有为 PHP 编写的 Micro-ORM

C#的dapper使用

还在纠结Dapper或者EF Core?不妨试试“混合ORM”--RepoDb

Dapper.NET 使用简单举例