有人可以解释一下Dapper.Rainbow与Dapper.Contrib之间的区别吗?
我的意思是你什么时候使用 Dapper.Contrib 的 SqlMapperExtensions.cs,什么时候应该使用 Dapper.Rainbow?
有人可以解释一下Dapper.Rainbow与Dapper.Contrib之间的区别吗?
我的意思是你什么时候使用 Dapper.Contrib 的 SqlMapperExtensions.cs,什么时候应该使用 Dapper.Rainbow?
我已经使用 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 引用:那个烦人的 INSERT 问题,将数据输入数据库
现在还有 2 个其他 API 可供您选择(除了 Rainbow 之外)(用于 CRUD) Dapper.Contrib和Dapper Extensions。我不认为一刀切。根据您的问题和偏好,可能会有最适合您的 API。我试图提出一些选择。没有幸运的“最好的方法”来解决世界上的每一个问题。
我怀疑 Sam 在上述引用和相关博客文章中试图传达的内容是:您的场景可能需要大量自定义映射(使用 vanilla Dapper),或者它可能需要跟踪实体更改(使用 Contrib),或者您可能有常见的使用场景(使用 Rainbow),或者您可能想要使用它们的组合。或者甚至不使用 Dapper。YMMV。
Adam Anderson 的这篇文章描述了几个 CRUD Dapper 扩展库之间的区别:
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。我试图提出一些选择。没有幸运的“最好的方法”来解决世界上的每一个问题。