Dapper.Rainbow VS Dapper.Contrib

时间:2012-04-05 14:12:59

标签: orm dapper dapper-rainbow

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

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

3 个答案:

答案 0 :(得分:73)

我一直在使用Dapper一段时间,并且想知道ContribRainbow项目是关于我自己的。经过一些代码审查,以下是我对其用途的看法:

Dapper.Contrib

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

  • 获取
  • 插入
  • 更新
  • 删除

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

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

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

Major Caveat :要获得Contrib的跟踪优势,必须使用Interface作为类型约束,以允许生成代理类。

Dapper.Rainbow

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

  • 获取
  • 插入
  • 更新
  • 删除

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

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

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

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

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

的差异?

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

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

旁注:我希望我之前已经查看了Rainbow,因为我已经建立了一个与Dapper一起使用的非常相似的基类。


引用文章并引用@anthonyv引用:That annoying INSERT problem, getting data into the DB

  

现在还有2个其他API可供您选择(除了Rainbow )(对于CRUD)    Dapper.Contrib Dapper Extensions 。   我不认为这是一刀切的。取决于您的问题和   首选项可能有一个最适合您的API。我试过了   提出一些选择。没有幸福的“最佳方式”可以解决   世界上的每一个问题。

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

答案 1 :(得分:20)

This post by Adam Anderson描述了几个CRUD Dapper扩展库之间的差异:

  • Dapper Contrib(自动更改跟踪 - 仅在脏或不相关时,自定义映射的属性,无复合键支持,无手动密钥支持)
  • Dapper Rainbow(使用Snapshotter进行手动更改跟踪,自定义映射的属性,无复合键支持,无手动密钥支持)
  • Dapper Extensions(无更改跟踪,自定义映射的Fluent配置,支持组合键,支持手动密钥规范),还包括用于简单查询的谓词系统
  • Dapper SimpleCRUD(无更改跟踪,自定义映射属性,无复合键支持,支持手动密钥规范),还包括过滤/分页助手,异步支持,自动POCO类生成(通过T4)

Dapper extensions differences

答案 2 :(得分: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.Contrib Dapper Extensions 。   我不认为这是一刀切的。取决于您的问题和   首选项可能有一个最适合您的API。我试过了   提出一些选择。没有幸福的“最佳方式”可以解决   世界上的每一个问题。