1

私はDapper、Massive、PetaPocoなどの「マイクロ」アプローチが好きで、データベースに送信するSQLを制御するのが好きです。ほとんどの場合、比較的単純です。また、POCOを使用するのも好きですが、やや柔軟なスキーマ設計を扱う場合、問題が発生することがよくあります:)

Personエンティティがあり、常に次のプロパティがあるとします。

  • Id
  • 名前
  • Eメール
  • 電話

ただし、場合によっては、次のような追加のプロパティが存在する可能性があります。

  • SpecialPhoneNumber
  • VeryCustomValue

いつもそこにあるとわかっている共通の特性を持つPOCOが本当に欲しいです。ただし、キー/値コレクションで他のアクセス可能なものを用意してください。

最善のアプローチは何でしょうか?そして、言及された「mirco-orm」のいずれかがこれをサポートしていますか?私はそれらすべてを調べましたが、それらがそうであるという兆候は見つかりませんでしたが、何かが足りないのかもしれません。

SqlDataReaderを使用してこれを直接行うことは可能でしょうか?または、リフレクションを使用してオブジェクトを作成するときに、数百行を読み取るパフォーマンスが低下しますか?言及されたormはすべてかなりうまくいくようで、下にあるDataReaderを使用していると思います。

あなたが助けることができることを願っています:)

編集:私たちはおそらく、アプリケーションアーキテクチャを制御できないことを言及する必要があります。これは、個々の顧客がアプリケーションと基盤となるデータベースをカスタマイズできるようにするERPソリューションです。アプリケーションにフィールドを追加すると、データベースに列が追加されます。悪い私!そもそもそれを明確にしないため

4

5 に答える 5

1

Massiveは、データをExpandoObjectに具体化するため、これをサポートできます。

秘密のソースはExpandoObjectです。Massiveに入るすべてのものと、Massiveから出るすべてのものは、Expandoです。これにより、やりたいことが何でもできます。基本的に、ExpandoObjectは単なるIDictionary <string、object>です。

ExpandoObjectはとを実装IDictionary<string, Object>してIEnumerable<KeyValuePair<string, Object>>いるため、必要な方法でメンバーを列挙してテストできます。

MassiveのデフォルトではSELECT *クエリを発行するため、ExpandoObjectには、知らないフィールドも含めて、テーブル内のすべてのフィールドが含まれます。

Massiveの現在のコードはGithubから入手できます。

Dapperは動的オブジェクトを選択することもできますが、Massiveとは異なり、データを選択することしかできず、データを挿入、更新、または削除することはできません。編集:Dapperのドキュメントを確認すると、任意のSQLを実行できるため、変更を実行できるようです。Dapperを使用した挿入の実行に関する最近の情報がいくつかあります。

于 2012-01-27T20:09:36.537 に答える
0

エンティティにデータを追加できるようにするには、デザインでタイプ継承ごとのテーブルまたは拡張テーブルを使用します。

于 2012-01-27T19:18:05.360 に答える
0

nHibernate の動的マッピングを見ることができます。

http://ayende.com/blog/3942/nhibernate-mapping-dynamic-component

このような拡張プロパティをジェネリックに取得できますDirectory<string,object>。したがって、このような汎用バッグ (辞書) を持つクラスがあり、XML マッピングを動的に拡張します。

nHibernate が残りの作業を行います。

于 2012-01-27T21:01:01.620 に答える
0

MyBatis.NET (以前の iBatis.NET) は、私が本当に便利だと思う機能を備えたデータ マッパー ツールです。聞いたことがない場合は、SQL を記述し、ドメイン オブジェクトを作成し、XML を使用してデータベースの列をドメイン オブジェクトのプロパティにマップできるようにする ORM ツールです。

これらの結果マッピングの 1 つは、次のようになります。

<resultMap id="Contact" class="Contact" >
    <result property="ContactId" column="ContactId" />
    <result property="FirstName" column="FirstName" />
    <result property="MiddleInitial" column="MiddleInitial" />
    <result property="LastName" column="LastName" />
</resultMap>

そこには、結果の ID、クラス エイリアス (たとえば、Namespace.Folder.Contact にマップされます)、およびプロパティ マッピングへの列のリストがあります。

クラスから継承するのと同じように、結果マップを拡張する機能があることに興味があるかもしれません。あなたの状況では、次のことが考えられます。

<resultMap id="Person" class="Person" >
    <result property="Id" column="Id" />
    <result property="Name" column="Name" />
    <result property="Email" column="Email" />
    <result property="Phone" column="Phone" />
</resultMap>

そしてあなたの他の状況のた​​めに:

<resultMap id="PersonExtended" extends="Person" class="Person">
    <!-- inherits all the "Person" result map properties -->
    <result property="SpecialPhoneNumber" column="SpecialPhoneNumber" />
    <result property="VeryCustomValue" column="VeryCustomValue" />
</resultMap>

次に、基本情報のみを選択して "Person" 結果マップにマップするクエリと、より多くの列を含む "PersonExtended" 結果マップにマップするクエリの 2 つの個別のクエリを作成します。

辞書への選択と N+1 選択の回避もサポートされています。念のために言っておきますが、私は MyBatis プロジェクトとはまったく関係がありません。MyBatis プロジェクトは非常に柔軟で、かなり堅実なデータ マッパーであることがわかりました。データベースを指すだけでデータ アクセス レイヤー全体を生成できるツールを作成したため、すべてのプロジェクトでこれを使用しています。

セットアップは少し面倒ですが、うまくいくかもしれません!

于 2012-01-27T19:32:48.103 に答える
-2

ID名Eメール電話しかし、場合によっては、SpecialPhoneNumberVeryCustomValueのような追加のプロパティがあるかもしれません

アーキテクトをプログラマースクール101に送り返します。設計エラー-電話とSpecialPhoneNumberはどちらもPersonのプロパティではありません(これはとにかくPersonではなく、法人になる可能性があるため「エンティティ」です)。

それらは「接点」か何かのリストです。

とは言うものの、プロパティバケットはORMでもデモンストレーションでき、パフォーマンスが低下しますが、これがSQLデータベースの動作方法です。プロパティバケットのパフォーマンスが悪い。

于 2012-01-27T19:17:54.880 に答える