【问题标题】:Dapper.Rainbow VS Dapper.ContribDapper.Rainbow VS Dapper.Contrib
【发布时间】:2012-04-19 07:01:01
【问题描述】:

谁能解释一下 Dapper.RainbowDapper.Contrib 之间的区别?

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

【问题讨论】:

    标签: orm dapper dapper-rainbow


    【解决方案1】:

    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 扩展。 我不认为一刀切。根据您的问题和 偏好可能有一个最适合您的 API。我试过了 提出一些选项。没有幸运的“最佳方法”来解决 世界上的每一个问题。

    【讨论】:

    • 我看不出 Sam 在他的帖子中描述了哪里不同。他描述了 Dapper.Rainbow,然后提到还有 Dapper.Contrib。但是这两种实现之间的实际区别是什么?
    【解决方案2】:

    我已经使用 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 引用:That annoying INSERT problem, getting data into the DB

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

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

    【讨论】:

    • 优秀的答案。 Rainbow 有 40k 的下载量和超过 200 万的贡献。似乎每个人都在使用 Contrib,甚至可能是为了 Rainbow 风格的功能,因为我猜 Rainbow 是 Contrib 的一个子集?
    【解决方案3】:

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

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

    【讨论】:

    • 嗨!有没有办法使用 Dapper.Contrib 获取跟踪数据?例如,我想在对数据库执行更新之前检查更改字段中的“旧”和“新”值。谢谢!
    • 从我在 2017 年 11 月的 source 中看到的,Dapper Contrib 只有一个 IProxy.IsDirty 标志,如果修改了“跟踪”对象的任何属性,就会设置该标志。所以Update 唯一要做的就是检查IsDirty 是否为true,然后更新所有列。 Dapper.Rainbow "Snapshotter" 可能是您正在寻找的工具。
    • 我已经尝试过 Snapshotter,但我希望已经在 Dapper 中完成了一些工作。使用 Snapshotter,我必须创建逻辑来比较更改的字段等。谢谢。如果你愿意,请检查一下,我创建了这个线程:github.com/StackExchange/Dapper/issues/876
    • 亚当·安德森原创文章的工作链接:web.archive.org/web/20160807040540/http://blog.falafel.com/…
    • DapperExtensions 是一个废弃的项目。使用时要小心!它不支持最新的 Dapper 版本,不能在 .NET 核心项目中使用。
    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    相关资源
    最近更新 更多