Dapper.Rainbow VS Dapper.Contrib


69

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

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

Answers:


79

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

Dapper.Contrib

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

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

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

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

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

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

达珀·彩虹

Rainbow是一个Abstract类,可以用作Dapper类的基类来提供基本的CRUD操作:

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

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

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

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

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

Major警告:Rainbow希望您的所有表都具有一个名为“ Id”的标识列。

差异?

Contrib和Rainbow之间的主要区别是(IMO),一个跟踪您实体的更改,另一个跟踪:

  • 如果您希望能够跟踪实体中的更改,请使用Contrib。
  • 如果您想按照标准ADO.NET方法使用更多功能,请使用Rainbow。

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


从文章和引用中@anthonyv引用:烦人的INSERT问题,将数据放入DB

现在,您还可以从Dapper.ContribDapper Extensions中选择另外两个API(除了Rainbow)(对于CRUD)(对于CRUD) 。我认为不可能一刀切。根据您的问题和偏好,可能有一个最适合您的API。我试图介绍一些选择。解决世界上的每一个问题,没有万能的“最佳方法”。

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


极好的答案。Rainbow的下载量达到4万,Contrib的下载量超过200万。似乎每个人都在使用Contrib,甚至是Rainbow样式的功能,因为我猜Rainbow是Contrib的子集?
niico

30

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

  • Dapper Contrib(自动更改跟踪-仅在是否脏的情况下,自定义映射的属性,不支持复合键,不支持手动键)
  • Dapper Rainbow(使用Snapshotter进行手动更改跟踪,自定义映射的属性,不支持复合键,不支持手动键)
  • Dapper扩展(无更改跟踪,用于自定义映射的Fluent配置,支持复合键,支持手动键规范),还包括用于简单查询的谓词系统(注意:已弃用-不支持最新的Dapper版本或.NET Core)
  • Dapper SimpleCRUD(无变化跟踪,自定义映射的属性,无复合键支持,支持手动键规范),还包括筛选/分页助手,异步支持,自动POCO类生成(通过T4)

Dapper扩展程序的差异


嗨!有没有一种方法可以使用Dapper.Contrib获取跟踪的数据?例如,我想在执行数据库更新之前检查更改字段中的“旧”和“新”值。谢谢!
Fernando Pardo

1
从我在11/2017的源中看到的情况来看,Dapper Contrib仅具有一个IProxy.IsDirty标志,如果修改了“ tracked”对象的任何属性,则该标志会设置。因此,唯一要做的就是Update检查是否IsDirtytrue,然后更新所有列。Dapper.Rainbow“ Snapshotter”可能是您正在寻找的工具。
Groo

我已经尝试过Snapshotter,但是我希望在Dapper中已经完成一些工作。使用Snapshotter,我必须创建逻辑来比较更改的字段等。谢谢。请检查是否需要,我创建了这个线程:github.com/StackExchange/Dapper/issues/876
Fernando Pardo

1
:由亚当·安德森有效链接原创文章 web.archive.org/web/20160807040540/http://blog.falafel.com/...
尼克Franceschina

1
DapperExtensions是一个废弃的项目。使用时要小心!它不支持最新的Dapper版本,并且不能在.NET核心项目中使用。
metabuddy '20

3

Sam详细描述了其帖子中的区别-http: //samsaffron.com/archive/2012/01/16/that-annoying-insert-problem-getting-data-into-the-db-using-dapper

基本上,它通常不是1的大小适合所有答案,它取决于我们根据您的需求决定采用哪种方法:

现在,您还可以从Dapper.ContribDapper Extensions中选择另外两个API(除了Rainbow)(对于CRUD)(对于CRUD) 。我认为不可能一刀切。根据您的问题和偏好,可能有一个最适合您的API。我试图介绍一些选择。解决世界上的每一个问题,没有万能的“最佳方法”。


15
我看不到山姆在哪里描述了他的职务的不同之处。他描述了Dapper.Rainbow,然后提到还有Dapper.Contrib。但是,这两种实现之间的实际区别是什么?
dannie.f 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.