web-dev-qa-db-ja.com

Dapper.Rainbow VS Dapper.Contrib

誰かがDapper.Rainbow vs. Dapper.Contribの違いを説明してもらえますか?

つまり、Dapper.ContribのSqlMapperExtensions.csをいつ使用し、いつDapper.Rainbowを使用する必要があるのでしょうか。

64
Shuaib

私はしばらくの間Dapperを使用してきましたが、 Contrib および Rainbow のプロジェクトはすべて自分自身について考えていました。コードを少しレビューした後、その使用法についての私の考えを以下に示します。

Dapper.Contrib

Contribは、基本的なCRUD操作のために、IDbConnectionインターフェイスで一連の拡張メソッドを提供します。

  • Get
  • インサート
  • 更新
  • 削除する

Contribの主要なコンポーネントは、変更が行われたかどうかを識別するためにエンティティを追跡することです。

たとえば、型制約としてインターフェイスでGetメソッドを使用すると、動的に生成されたプロキシクラスと内部ディクショナリが返され、変更されたプロパティが追跡されます。

その後、Updateメソッドを使用して、変更されたプロパティのみを更新するために必要なSQLを生成できます。

主要な警告:Contribの追跡の良さを得るには、タイプ制約としてインターフェイスを使用して、プロキシクラスを生成できるようにする必要があります。

Dapper.Rainbow

Rainbowは、Dapperクラスの基本クラスとして使用して基本的なCRUD操作を提供できる抽象クラスです。

  • Get
  • インサート
  • 更新
  • 削除する

First(テーブルの最初のレコードを取得)やAll(テーブルのすべての結果レコードを取得)などの一般的に使用されるメソッドと同様に。

すべての意図と目的において、Rainbowは基本的に最もよく使用されるデータベースインタラクションのラッパーであり、プロパティ名と型の制約に基づいて退屈なSQLを構築します。

たとえば、Get操作では、RainbowはVanilla SQLクエリを構築し、すべての列を返し、それらの値を制約として使用される型にマップします。

同様に、挿入/更新メソッドは、型制約のプロパティ名に基づいて、挿入/更新に必要なSQLを動的に構築します。

主要な警告:Rainbowは、すべてのテーブルに「Id」という名前のID列があることを想定しています。

違いは?

ContribとRainbowの主な違いは(IMO)です。1つはエンティティの変更を追跡し、もう1つは追跡しません:

  • エンティティの変更を追跡できるようにする場合は、Contribを使用します。
  • 標準のADO.NETアプローチのラインに沿ってさらに何かを使用する場合は、Rainbowを使用します。

補足:Dapperで使用する非常によく似た基本クラスを構築したため、以前にRainbowを調べていたらよかったのに。


引用された記事と引用@anthonyvから: その迷惑なINSERT問題、DBへのデータの取得

他にも2つのAPIを選択できます( Rainbow )(CRUDの場合)Dapper.Contribおよび Dapper Extensions 。私は万能だとは思いません。問題と設定に応じて、最適なAPIが存在する場合があります。私はいくつかのオプションを提示しようとしました。世界のあらゆる問題を解決する祝福された「最善の方法」はありません。

サムが上記の引用で伝えようとしていたことと、関連するブログ投稿は次のとおりだったと思います:あなたのシナリオでは、多くのカスタムマッピングが必要な場合(Vanilla Dapperを使用)、またはエンティティの変更を追跡する必要がある場合があります(Contribを使用)、または一般的な使用シナリオ(Rainbowを使用)を使用するか、それらすべてを組み合わせて使用​​することができます。または、Dapperを使用しません。 YMMV。

73
Metro Smurf

アダムアンダーソンによるこの投稿 は、いくつかのCRUD Dapper拡張ライブラリの違いについて説明しています。

  • Dapper Contrib (自動変更追跡-ダーティかそうでない場合のみ、カスタムマッピングの属性、複合キーサポートなし、手動キーサポートなし)
  • Dapper Rainbow (Snapshotterを使用した手動変更追跡、カスタムマッピングの属性、複合キーのサポートなし、手動キーのサポートなし)
  • Dapper Extensions (変更追跡なし、カスタムマッピングのFluent構成、複合キーのサポート、手動キー指定のサポート)、簡単なクエリの述語システムも含まれます
  • Dapper SimpleCRUD (変更追跡なし、カスタムマッピングの属性、複合キーサポートなし、手動キー仕様のサポート)、フィルタリング/ページングヘルパー、非同期サポート、自動POCOクラス生成(T4を使用)も含まれます

Dapper extensions differences

20
Groo

サムは彼の投稿の違いを詳細に説明します- http://samsaffron.com/archive/2012/01/16/that-annoying-insert-problem-getting-data-into-the-db- using-dapper

基本的に、通常の1サイズではないすべての答えに適合し、ニーズに基づいてどのアプローチを採用するかを決定するのは私たち次第です:

また、他に2つのAPIを選択できます(beins Rainbow)(CRUDの場合)Dapper.ContribおよびDapper Extensions。私は万能だとは思いません。問題と設定によっては、最適なAPIが存在する場合があります。私はいくつかのオプションを提示しようとしました。世界のあらゆる問題を解決する祝福された「最善の方法」はありません。

3
anthonyv