Dapper.Rainbow VS Dapper.Contrib
有人可以解释Dapper.Rainbow与Dapper.Contrib之间的区别吗?
我的意思是什么时候使用Dapper.Contrib的SqlMapperExtensions.cs,什么时候应该使用Dapper.Rainbow?
我一直在使用Dapper,并且想知道Contrib和Rainbow项目是关于我自己的。 经过一些代码审查,这里是我的想法在他们的用途:
Dapper.Contrib
Contrib在基本CRUD操作的IDbConnection接口上提供了一组扩展方法:
- 得到
- 插
- 更新
- 删除
Contrib的关键组件是它为您的实体提供跟踪以确定是否进行了更改。
例如,使用带有接口的Get方法作为types约束,将返回一个dynamic生成的带有内部字典的代理类,以跟踪哪些属性发生了变化。
然后,您可以使用Update方法来生成仅更新已更改的属性所需的SQL。
Major Caveat :要获得Contrib的跟踪效果,必须使用Interface作为types约束来允许生成代理类。
Dapper.Rainbow
Rainbow是一个Abstract类,你可以用它作为你的Dapper类的基类来提供基本的CRUD操作:
- 得到
- 插
- 更新
- 删除
以及一些常用的方法,如First(获取表中的第一条logging)和All(获取表中的所有结果logging)。
对于所有的意图和目的,Rainbow基本上是最常用的数据库交互的一个包装,并会根据属性名称和types限制来构build枯燥的SQL。
例如,使用Get操作,Rainbow将构build一个vanilla SQL查询并返回所有列,然后将这些值映射回用作约束的types。
同样,插入/更新方法将根据types约束的属性名称dynamic构build插入/更新所需的SQL。
主要警告 :Rainbow期望所有的表都有一个名为“Id”的标识列。
区别在哪里?
Contrib和Rainbow之间的主要区别是(IMO),跟踪实体的变化,另一个不会:
- 当你想能够跟踪实体的变化时使用Contrib。
- 当您想要使用更多沿着标准的ADO.NET方法的东西时使用彩虹。
在旁注中:我希望我早些时候看过彩虹,因为我已经build立了一个非常相似的基类,与Dapper一起使用。
从文章和引用@anthonyv援引: 烦人的INSERT问题,获取数据到数据库
现在还有其他2个API可以select( 除了Rainbow )(对于CRUD) Dapper.Contrib和Dapper Extensions 。 我不认为这是一个通用的方法。 根据您的问题和偏好,可能有一个最适合您的API。 我试图提出一些select。 解决世界上每一个问题都没有“幸福的最佳途径”。
我怀疑Sam在上面的引用中想expression的是:你的场景可能需要大量的自定义映射(使用vanilla Dapper),或者它可能需要跟踪实体变化(使用Contrib),或者你可能有常见的使用场景(使用彩虹),或者你可能想要使用它们的组合。 或者甚至不使用Dapper。 因人而异。
Adam Anderson的这篇文章描述了几个CRUD Dapper扩展库之间的区别:
- Dapper Contrib (自动更改跟踪 – 只有在不需要修改的情况下,自定义映射的属性,不支持组合键,不支持手动键)
- Dapper Rainbow (使用Snapshot的手动更改跟踪,自定义映射的属性,无复合键支持,无手动键支持)
- Dapper扩展 (无变化跟踪,自定义映射的Fluentconfiguration,支持复合键,支持手动键规范),还包括简单查询的谓词系统
- Dapper SimpleCRUD (无变化跟踪,自定义映射属性,无复合键支持,支持手动键规范),还包括过滤/分页助手,asynchronous支持,自动POCO类的生成(通过T4)
萨姆详细描述了他的post中的不同之处 – http://samsaffron.com/archive/2012/01/16/that-annoying-insert-problem-getting-data-into-the-db-using-dapper 。
基本上,它通常不是一个尺寸适合所有的答案,它取决于我们根据您的需要决定采用哪种方法:
现在还有其他2个API可以select( 除了Rainbow )(对于CRUD) Dapper.Contrib和Dapper Extensions 。 我不认为这是一个通用的方法。 根据您的问题和偏好,可能有一个最适合您的API。 我试图提出一些select。 解决世界上每一个问题都没有得到幸运的“最好的办法”。