誰かがDapper.Rainbow vs. Dapper.Contribの違いを説明してもらえますか?
つまり、Dapper.ContribのSqlMapperExtensions.csをいつ使用し、いつDapper.Rainbowを使用する必要があるのでしょうか。
私はしばらくの間Dapperを使用してきましたが、 Contrib および Rainbow のプロジェクトはすべて自分自身について考えていました。コードを少しレビューした後、その使用法についての私の考えを以下に示します。
Contribは、基本的なCRUD操作のために、IDbConnectionインターフェイスで一連の拡張メソッドを提供します。
Contribの主要なコンポーネントは、変更が行われたかどうかを識別するためにエンティティを追跡することです。
たとえば、型制約としてインターフェイスでGetメソッドを使用すると、動的に生成されたプロキシクラスと内部ディクショナリが返され、変更されたプロパティが追跡されます。
その後、Updateメソッドを使用して、変更されたプロパティのみを更新するために必要なSQLを生成できます。
主要な警告:Contribの追跡の良さを得るには、タイプ制約としてインターフェイスを使用して、プロキシクラスを生成できるようにする必要があります。
Rainbowは、Dapperクラスの基本クラスとして使用して基本的なCRUD操作を提供できる抽象クラスです。
First(テーブルの最初のレコードを取得)やAll(テーブルのすべての結果レコードを取得)などの一般的に使用されるメソッドと同様に。
すべての意図と目的において、Rainbowは基本的に最もよく使用されるデータベースインタラクションのラッパーであり、プロパティ名と型の制約に基づいて退屈なSQLを構築します。
たとえば、Get操作では、RainbowはVanilla SQLクエリを構築し、すべての列を返し、それらの値を制約として使用される型にマップします。
同様に、挿入/更新メソッドは、型制約のプロパティ名に基づいて、挿入/更新に必要なSQLを動的に構築します。
主要な警告:Rainbowは、すべてのテーブルに「Id」という名前のID列があることを想定しています。
ContribとRainbowの主な違いは(IMO)です。1つはエンティティの変更を追跡し、もう1つは追跡しません:
補足:Dapperで使用する非常によく似た基本クラスを構築したため、以前にRainbowを調べていたらよかったのに。
引用された記事と引用@anthonyvから: その迷惑なINSERT問題、DBへのデータの取得
他にも2つのAPIを選択できます( Rainbow )(CRUDの場合)Dapper.Contribおよび Dapper Extensions 。私は万能だとは思いません。問題と設定に応じて、最適なAPIが存在する場合があります。私はいくつかのオプションを提示しようとしました。世界のあらゆる問題を解決する祝福された「最善の方法」はありません。
サムが上記の引用で伝えようとしていたことと、関連するブログ投稿は次のとおりだったと思います:あなたのシナリオでは、多くのカスタムマッピングが必要な場合(Vanilla Dapperを使用)、またはエンティティの変更を追跡する必要がある場合があります(Contribを使用)、または一般的な使用シナリオ(Rainbowを使用)を使用するか、それらすべてを組み合わせて使用することができます。または、Dapperを使用しません。 YMMV。
アダムアンダーソンによるこの投稿 は、いくつかのCRUD Dapper拡張ライブラリの違いについて説明しています。
サムは彼の投稿の違いを詳細に説明します- 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が存在する場合があります。私はいくつかのオプションを提示しようとしました。世界のあらゆる問題を解決する祝福された「最善の方法」はありません。