Dapperはデータの欠落を警告または失敗しません

c#-4.0 dapper orm

質問

たとえばクラスがあるとしましょう(例として単純です)、PersonIdとNameフィールドに常に値が設定されていることを確認したいとします。

public class Person
{
    int PersonId { get; set; }
    string Name { get; set; }
    string Address { get; set; }
}

現在、私の質問は

Person p = conn.Query<Person>("SELECT * FROM People");

しかし、私はデータベーススキーマをPersonIdからPIDに変更した可能性があり、コードはうまくいっています。

私がしたいのは次のうちの一つです:

  1. PersonIdのプロパティを、Required(デーダが検証できる)などの属性で飾ります。

  2. Dapperに、マッピングが完全に書き込まれていないことを確認するように指示します(つまり、クラスのすべてのプロパティがクエリのデータで満たされていない場合に例外をスローします)。

これは現在可能ですか?もしそうでなければ、パフォーマンスにあまりにも悪影響を及ぼさずにこれをどうやって行うことができるかを誰かが指摘できますか?

IMHO 、2番目のオプションは、ユーザーの既存のコードを破らず、アクセスできないクラスでより多くの属性デコレーションを必要としないため、最も効果的です。

エキスパート回答

現時点では、これは不可能ではありません。実際には、部分モデルの作成に積極的に役立つケースがたくさんあるので、何も暗黙的に追加することは望ましくありません。多くの場合、ドメインモデルはデータモデルの拡張ビューであるため、オプション2は機能しないと思います。コード内であまりにも多くの箇所で破損することがあるとわかっています。オプション...

これまでのところ、私たちは意図的に属性のようなものを避けていました。考えを維持することがされているとして、できるだけリーンと直接です。私は病理学に属性に反対しているわけではありません。ただ、それを調べなければならないという問題があります。しかし、おそらく時間です...私たちはおそらく同時に簡単な列マッピングを可能にすることもできます。

[Map(Name = "Person Id", Required = true)]
int PersonId { get; set; }

NameRequired両方がオプションです。思考?これはいくつかの点で問題があります。特に、現時点では、特に拡張APIの中で見ることができる列のみを調べています。

もう1つの可能性は、私たちがチェックするインターフェイスです。ロード後に手動でデータを確認できるようにします。例えば:

public class Person : IMapCallback {
    void IMapCallback.BeforePopulate() {}
    void IMapCallback.AfterPopulate() {
        if(PersonId == 0)
            throw new InvalidOperationException("PersonId not populated");
    }
}

インターフェイスオプションは、私を多くの点でより幸せにします:

  • 余分な反射プロービング(1回のチェックで済む)を避けることができます。
  • それはより柔軟です - あなたはあなたに何が重要かを選択することができます
  • 拡張性APIには影響しません

しかし、それはもっとマニュアルです。

私は入力に開いたんだけど、私たちは燃えるすべての銃でそれではなく、ラッシュを得ることを確認します。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow