72

有人可以解释一下Dapper.RainbowDapper.Contrib之间的区别吗?

我的意思是你什么时候使用 Dapper.Contrib 的 SqlMapperExtensions.cs,什么时候应该使用 Dapper.Rainbow?

4

3 回答 3

82

我已经使用 Dapper 有一段时间了,我想知道ContribRainbow项目是关于我自己的。经过一些代码审查,以下是我对它们的使用的想法:

Dapper.Contrib

Contrib 在 IDbConnection 接口上提供了一组扩展方法,用于基本的 CRUD 操作:

  • 得到
  • 插入
  • 更新
  • 删除

Contrib 的关键组件是它为您的实体提供跟踪,以识别是否进行了更改。

例如,使用带有接口的 Get 方法作为类型约束将返回一个动态生成的代理类,其中包含一个内部字典以跟踪哪些属性已更改。

然后,您可以使用 Update 方法生成仅更新那些已更改的属性所需的 SQL。

主要警告:要获得 Contrib 的跟踪优势,您必须使用接口作为类型约束以允许生成代理类。

Dapper.Rainbow

Rainbow 是一个抽象类,您可以将其用作 Dapper 类的基类,以提供基本的 CRUD 操作:

  • 得到
  • 插入
  • 更新
  • 删除

以及一些常用的方法,例如First(获取表中的第一条记录)和All(获取表中的所有结果记录)。

出于所有意图和目的,Rainbow 基本上是您最常用的数据库交互的包装器,它将基于属性名称和类型约束构建无聊的 SQL。

例如,通过 Get 操作,Rainbow 将构建一个普通 SQL 查询并返回所有列,然后将这些值映射回用作约束的类型。

同样,插入/更新方法将根据类型约束的属性名称动态构建插入/更新所需的 SQL。

主要警告:Rainbow 期望您的所有表都有一个名为“Id”的标识列。

差异?

Contrib 和 Rainbow 之间的主要区别是 (IMO),一个跟踪实体的变化,另一个不跟踪:

  • 当您希望能够跟踪实体中的更改时,请使用 Contrib。
  • 当您想使用更多符合标准 ADO.NET 方法的内容时,请使用 Rainbow。

附带说明:我希望我早点研究过 Rainbow,因为我已经建立了一个与 Dapper 一起使用的非常相似的基类。


从文章和引用@anthonyv 引用:那个烦人的 INSERT 问题,将数据输入数据库

现在还有 2 个其他 API 可供您选择(除了 Rainbow 之外)(用于 CRUD) Dapper.ContribDapper Extensions。我不认为一刀切。根据您的问题和偏好,可能会有最适合您的 API。我试图提出一些选择。没有幸运的“最好的方法”来解决世界上的每一个问题。

我怀疑 Sam 在上述引用和相关博客文章中试图传达的内容是:您的场景可能需要大量自定义映射(使用 vanilla Dapper),或者它可能需要跟踪实体更改(使用 Contrib),或者您可能有常见的使用场景(使用 Rainbow),或者您可能想要使用它们的组合。或者甚至不使用 Dapper。YMMV。

于 2012-10-24T15:14:02.273 回答
34

Adam Anderson 的这篇文章描述了几个 CRUD Dapper 扩展库之间的区别:

  • Dapper Contrib(自动更改跟踪 - 仅在脏与否时,用于自定义映射的属性,不支持复合键,不支持手动键)
  • Dapper Rainbow(使用 Snapshotter 进行手动更改跟踪,自定义映射的属性,不支持复合键,不支持手动键)
  • Dapper 扩展(无更改跟踪、自定义映射的流畅配置、支持复合键、支持手动键规范),还包括用于简单查询的谓词系统(注意:不推荐使用- 不支持最新的 Dapper 版本或 .NET 核心)
  • Dapper SimpleCRUD(无更改跟踪、自定义映射的属性、无复合键支持、支持手动键规范),还包括过滤/分页助手、异步支持、自动 POCO 类生成(通过 T4)

Dapper 扩展差异

于 2016-10-24T13:27:38.460 回答
3

Sam 在他的帖子中详细描述了不同之处 - http://samsaffron.com/archive/2012/01/16/that-annoying-insert-problem-getting-data-into-the-db-using-dapper

基本上,它通常不是 1 尺寸适合所有答案,由我们根据您的需要决定采用哪种方法:

现在还有 2 个其他 API 可供您选择(除了 Rainbow 之外)(用于 CRUD) Dapper.ContribDapper Extensions。我不认为一刀切。根据您的问题和偏好,可能会有最适合您的 API。我试图提出一些选择。没有幸运的“最好的方法”来解决世界上的每一个问题。

于 2012-05-10T02:07:42.427 回答