有人可以解释一下Dapper.Rainbow与Dapper.Contrib之间的区别吗?
我的意思是什么时候使用Dapper.Contrib的SqlMapperExtensions.cs,什么时候应该使用Dapper.Rainbow?
Answers:
我已经使用Dapper一段时间了,想知道Contrib和Rainbow项目是关于我自己的。经过一点代码审查,以下是我对它们的用法的想法:
Contrib在IDbConnection接口上提供了一组扩展方法,用于基本的CRUD操作:
Contrib的关键组件是为您的实体提供跟踪,以识别是否进行了更改。
例如,将Get方法与接口一起用作类型约束,将返回带有内部字典的动态生成的代理类,以跟踪哪些属性已更改。
然后,您可以使用Update方法,该方法将生成仅更新那些已更改的属性所需的SQL。
主要警告:要获得Contrib的跟踪优势,必须使用接口作为类型约束,以允许生成代理类。
Rainbow是一个Abstract类,可以用作Dapper类的基类来提供基本的CRUD操作:
以及一些常用的方法,例如First(获取表中的第一条记录)和All(获取表中的所有结果记录)。
出于所有目的和目的,Rainbow基本上是您最常用的数据库交互的包装,并且将基于属性名称和类型约束来构建无聊的SQL。
例如,通过Get操作,Rainbow将建立一个普通的SQL查询并返回所有列,然后将这些值映射回用作约束的类型。
同样,insert / update方法将根据类型约束的属性名称动态构建插入/更新所需的SQL。
Major警告:Rainbow希望您的所有表都具有一个名为“ Id”的标识列。
Contrib和Rainbow之间的主要区别是(IMO),一个跟踪您实体的更改,另一个跟踪:
附带说明:我希望早些时候研究Rainbow,因为我建立了与Dapper一起使用的非常相似的基类。
从文章和引用中@anthonyv引用:烦人的INSERT问题,将数据放入DB
现在,您还可以从Dapper.Contrib和Dapper Extensions中选择另外两个API(除了Rainbow)(对于CRUD)(对于CRUD) 。我认为不可能一刀切。根据您的问题和偏好,可能有一个最适合您的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的大小适合所有答案,它取决于我们根据您的需求决定采用哪种方法:
现在,您还可以从Dapper.Contrib和Dapper Extensions中选择另外两个API(除了Rainbow)(对于CRUD)(对于CRUD) 。我认为不可能一刀切。根据您的问题和偏好,可能有一个最适合您的API。我试图介绍一些选择。解决世界上的每一个问题,没有万能的“最佳方法”。