【发布时间】:2012-04-19 07:01:01
【问题描述】:
谁能解释一下 Dapper.Rainbow 与 Dapper.Contrib 之间的区别?
我的意思是你什么时候使用 Dapper.Contrib 的 SqlMapperExtensions.cs,什么时候应该使用 Dapper.Rainbow?
【问题讨论】:
标签: orm dapper dapper-rainbow
谁能解释一下 Dapper.Rainbow 与 Dapper.Contrib 之间的区别?
我的意思是你什么时候使用 Dapper.Contrib 的 SqlMapperExtensions.cs,什么时候应该使用 Dapper.Rainbow?
【问题讨论】:
标签: orm dapper dapper-rainbow
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 扩展。 我不认为一刀切。根据您的问题和 偏好可能有一个最适合您的 API。我试过了 提出一些选项。没有幸运的“最佳方法”来解决 世界上的每一个问题。
【讨论】:
我已经使用 Dapper 有一段时间了,我想知道 Contrib 和 Rainbow 项目都是关于我自己的。经过一些代码审查,以下是我对它们的使用的想法:
Contrib 在 IDbConnection 接口上提供了一组扩展方法,用于基本的 CRUD 操作:
Contrib 的关键组件是它为您的实体提供跟踪,以识别是否进行了更改。
例如,使用带有接口的 Get 方法作为类型约束将返回一个动态生成的代理类,其中包含一个内部字典以跟踪哪些属性已更改。
然后您可以使用 Update 方法生成仅更新那些已更改的属性所需的 SQL。
主要警告:要获得 Contrib 的跟踪优势,您必须使用接口作为类型约束以允许生成代理类。
Rainbow 是一个抽象类,您可以将其用作 Dapper 类的基类,以提供基本的 CRUD 操作:
以及一些常用的方法,如First(获取表中的第一条记录)和All(获取表中的所有结果记录)。
出于所有意图和目的,Rainbow 基本上是您最常用的数据库交互的包装器,它将基于属性名称和类型约束构建无聊的 SQL。
例如,通过 Get 操作,Rainbow 将构建一个普通 SQL 查询并返回所有列,然后将这些值映射回用作约束的类型。
同样,插入/更新方法将根据类型约束的属性名称动态构建插入/更新所需的 SQL。
主要警告:Rainbow 希望您的所有表都有一个名为“Id”的标识列。
Contrib 和 Rainbow 的主要区别在于 (IMO),一个跟踪实体的变化,另一个不跟踪:
附带说明:我希望我早点研究过 Rainbow,因为我已经建立了一个与 Dapper 非常相似的基类。
来自文章并引用@anthonyv 引用:That annoying INSERT problem, getting data into the DB
现在您还可以选择另外 2 个 API(除了 Rainbow)(用于 CRUD) Dapper.Contrib 和 Dapper 扩展。 我不认为一刀切。根据您的问题和 偏好可能有一个最适合您的 API。我试过了 提出一些选项。没有幸运的“最佳方法”来解决 世界上的每一个问题。
我怀疑 Sam 在上述引用和相关博客文章中试图传达的内容是:您的场景可能需要大量自定义映射(使用 vanilla Dapper),或者可能需要跟踪实体更改(使用 Contrib),或者您可能有常见的使用场景(使用 Rainbow),或者您可能想要使用它们的组合。或者甚至不使用 Dapper。 YMMV。
【讨论】:
This post by Adam Anderson 描述了几个 CRUD Dapper 扩展库之间的区别:
【讨论】:
IProxy.IsDirty 标志,如果修改了“跟踪”对象的任何属性,就会设置该标志。所以Update 唯一要做的就是检查IsDirty 是否为true,然后更新所有列。 Dapper.Rainbow "Snapshotter" 可能是您正在寻找的工具。