2012-04-05 33 views
61

有人能解釋一下Dapper.RainbowDapper.Contrib之間的區別嗎?Dapper.Rainbow VS Dapper.Contrib

我的意思是什麼時候使用Dapper.Contrib的SqlMapperExtensions.cs,什麼時候應該使用Dapper.Rainbow?

回答

64

我一直在使用Dapper一段時間,並想知道ContribRainbow項目是關於我自己的。有點代碼審查後,下面是它們的用途我的想法:

Dapper.Contrib

的Contrib提供了一套基本的CRUD操作IDbConnection接口的擴展方法:

  • 獲取
  • 插入
  • 更新
  • 刪除

Contrib的關鍵組件是它爲您的實體提供跟蹤以確定是否進行了更改。

例如,使用Get方法和接口作爲類型約束將返回一個動態生成的代理類和一個內部字典,以跟蹤哪些屬性發生了變化。

然後,您可以使用Update方法,該方法將生成僅更新那些已更改的屬性所需的SQL。

Major Caveat:爲了獲得Contrib的跟蹤效果,必須使用Interface作爲類型約束來允許生成代理類。

Dapper。彩虹

彩虹是,你可以爲你的精緻小巧類的基類中使用抽象類提供基本的CRUD操作:

  • 獲取
  • 插入
  • 更新
  • 刪除

以及一些常用的方法,如First(獲取表中的第一條記錄)和All(獲取所有結果rec表中的ords)。

對於所有的意圖和目的,Rainbow基本上是最常用的數據庫交互的包裝,並且會根據屬性名稱和類型限制來構建枯燥的SQL。

例如,使用Get操作,Rainbow將構建一個vanilla SQL查詢並返回所有列,然後將這些值映射回用作約束的類型。

類似地,插入/更新方法將基於類型約束的屬性名稱動態構建插入/更新所需的SQL。

Major警告:Rainbow期望您所有的表都有一個名爲「Id」的標識列。

差異?

的Contrib和彩虹之間的主要區別是(IMO),一個跟蹤更改您的實體,其他沒有:

  • 使用的Contrib當你希望能夠在你的實體來跟蹤變化。
  • 當您想要使用更多沿着標準ADO.NET方法的線條時使用Rainbow。

附註:我希望我早些時候看過彩虹,因爲我已經建立了一個非常相似的基類,與Dapper一起使用。


從文章和報價@anthonyv報價:That annoying INSERT problem, getting data into the DB

現在有2層其他的API,你可以從如選擇(除了彩虹)(用於CRUD) 小巧玲瓏。 ContribDapper Extensions。 我不認爲這是一種萬能的方式。根據您的問題和 首選項,可能有最適合您的API。我嘗試了 目前的一些選項。世界上每個問題都沒有解決問題的「最佳方式」。

我懷疑什麼山姆試圖在上述報價,傳達相關的博客文章是:您的情況可能需要大量的自定義映射(用香草小巧玲瓏的),或者它可能需要跟蹤實體的改變(使用Contrib),或者您可能有常見的使用場景(使用Rainbow),或者您可能想要將它們全部組合使用。或者甚至不使用Dapper。因人而異。

+1

還有Dapper.SimpleCRUD https://github.com/ericdc1/Dapper.SimpleCRUD – 2015-06-29 06:59:34

3

Sam詳細地描述了他的帖子中的區別 - http://samsaffron.com/archive/2012/01/16/that-annoying-insert-problem-getting-data-into-the-db-using-dapper

基本上,它通常不是1個一刀切的答案,它由我們來決定一起去哪種方法根據您的需求:

有現在你可以從如選擇2個其他API (除了彩虹)(對於CRUD) Dapper.ContribDapper Extensions。 我不認爲這是一種萬能的方式。根據您的問題和 首選項,可能有最適合您的API。我嘗試了 目前的一些選項。世界上每個問題都沒有解決問題的「最佳方式」。

+13

我沒有看到山姆介紹了他的職位的差異。他描述的Dapper.Rainbow然後提到,也有Dapper.Contrib。但是這兩種實現之間的實際區別是什麼? – 2012-05-18 13:48:00

14

This post by Adam Anderson介紹幾種CRUD小巧玲瓏的擴展庫之間的差異:

  • Dapper Contrib(自動更改跟蹤 - 只有當髒的,屬性自定義映射,無複合鍵的支持,無需手動關鍵支撐)
  • Dapper Rainbow(使用Snapshotter進行手動更改跟蹤,用於自定義映射的屬性,無複合鍵支持,無手動鍵支持)
  • Dapper Extensions(無更改跟蹤,自定義映射的Fluent配置,支持複合鍵,Sup端口手動密鑰規範),還包括用於簡單查詢的謂詞系統
  • Dapper SimpleCRUD(無更改跟蹤,自定義映射的屬性,無複合鍵支持,支持手動鍵規範),還包括過濾/分頁助手,異步支持,自動POCO類生成(通過T4)

Dapper extensions differences

+0

嗨!有沒有辦法使用Dapper.Contrib獲取跟蹤數據?例如,我想在更改數據庫之前檢查已更改字段中的「舊」和「新」值。謝謝! – 2017-11-08 12:16:32

+0

根據我在[11] 2017年的[source](https://github.com/StackExchange/Dapper/blob/master/Dapper.Contrib/SqlMapperExtensions.cs)中看到的,Dapper Contrib只有一個'IProxy.IsDirty如果修改了「跟蹤」對象的任何屬性,則設置該標誌。所以'Update'唯一的事情就是檢查'IsDirty'是否爲'true',然後更新所有的列。 Dapper.Rainbow「Snapshotter」可能是您正在尋找的工具。 – Groo 2017-11-08 14:05:49

+0

我已經嘗試過Snapshotter,但我想要在Dapper中完成一些操作。使用Snapshotter我必須創建邏輯來比較更改的字段等。謝謝。請檢查這個如果你想要的,我創建了這個線程:https://github.com/StackExchange/Dapper/issues/876 – 2017-11-09 09:54:27

相關問題