有人能解釋一下Dapper.Rainbow與Dapper.Contrib之間的區別嗎?Dapper.Rainbow VS Dapper.Contrib
我的意思是什麼時候使用Dapper.Contrib的SqlMapperExtensions.cs,什麼時候應該使用Dapper.Rainbow?
有人能解釋一下Dapper.Rainbow與Dapper.Contrib之間的區別嗎?Dapper.Rainbow VS Dapper.Contrib
我的意思是什麼時候使用Dapper.Contrib的SqlMapperExtensions.cs,什麼時候應該使用Dapper.Rainbow?
我一直在使用Dapper一段時間,並想知道Contrib和Rainbow項目是關於我自己的。有點代碼審查後,下面是它們的用途我的想法:
的Contrib提供了一套基本的CRUD操作IDbConnection接口的擴展方法:
Contrib的關鍵組件是它爲您的實體提供跟蹤以確定是否進行了更改。
例如,使用Get方法和接口作爲類型約束將返回一個動態生成的代理類和一個內部字典,以跟蹤哪些屬性發生了變化。
然後,您可以使用Update方法,該方法將生成僅更新那些已更改的屬性所需的SQL。
Major Caveat:爲了獲得Contrib的跟蹤效果,必須使用Interface作爲類型約束來允許生成代理類。
彩虹是,你可以爲你的精緻小巧類的基類中使用抽象類提供基本的CRUD操作:
以及一些常用的方法,如First(獲取表中的第一條記錄)和All(獲取所有結果rec表中的ords)。
對於所有的意圖和目的,Rainbow基本上是最常用的數據庫交互的包裝,並且會根據屬性名稱和類型限制來構建枯燥的SQL。
例如,使用Get操作,Rainbow將構建一個vanilla SQL查詢並返回所有列,然後將這些值映射回用作約束的類型。
類似地,插入/更新方法將基於類型約束的屬性名稱動態構建插入/更新所需的SQL。
Major警告:Rainbow期望您所有的表都有一個名爲「Id」的標識列。
的Contrib和彩虹之間的主要區別是(IMO),一個跟蹤更改您的實體,其他沒有:
附註:我希望我早些時候看過彩虹,因爲我已經建立了一個非常相似的基類,與Dapper一起使用。
從文章和報價@anthonyv報價:That annoying INSERT problem, getting data into the DB
現在有2層其他的API,你可以從如選擇(除了彩虹)(用於CRUD) 小巧玲瓏。 Contrib和Dapper Extensions。 我不認爲這是一種萬能的方式。根據您的問題和 首選項,可能有最適合您的API。我嘗試了 目前的一些選項。世界上每個問題都沒有解決問題的「最佳方式」。
我懷疑什麼山姆試圖在上述報價,傳達相關的博客文章是:您的情況可能需要大量的自定義映射(用香草小巧玲瓏的),或者它可能需要跟蹤實體的改變(使用Contrib),或者您可能有常見的使用場景(使用Rainbow),或者您可能想要將它們全部組合使用。或者甚至不使用Dapper。因人而異。
Sam詳細地描述了他的帖子中的區別 - http://samsaffron.com/archive/2012/01/16/that-annoying-insert-problem-getting-data-into-the-db-using-dapper。
基本上,它通常不是1個一刀切的答案,它由我們來決定一起去哪種方法根據您的需求:
有現在你可以從如選擇2個其他API (除了彩虹)(對於CRUD) Dapper.Contrib和Dapper Extensions。 我不認爲這是一種萬能的方式。根據您的問題和 首選項,可能有最適合您的API。我嘗試了 目前的一些選項。世界上每個問題都沒有解決問題的「最佳方式」。
我沒有看到山姆介紹了他的職位的差異。他描述的Dapper.Rainbow然後提到,也有Dapper.Contrib。但是這兩種實現之間的實際區別是什麼? – 2012-05-18 13:48:00
This post by Adam Anderson介紹幾種CRUD小巧玲瓏的擴展庫之間的差異:
嗨!有沒有辦法使用Dapper.Contrib獲取跟蹤數據?例如,我想在更改數據庫之前檢查已更改字段中的「舊」和「新」值。謝謝! – 2017-11-08 12:16:32
根據我在[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
我已經嘗試過Snapshotter,但我想要在Dapper中完成一些操作。使用Snapshotter我必須創建邏輯來比較更改的字段等。謝謝。請檢查這個如果你想要的,我創建了這個線程:https://github.com/StackExchange/Dapper/issues/876 – 2017-11-09 09:54:27
還有Dapper.SimpleCRUD https://github.com/ericdc1/Dapper.SimpleCRUD – 2015-06-29 06:59:34