2016-04-03 9 views
3

は、私はこれらの2つのクラスを持っています。子プロパティと親プロパティを比較しますか?私は細部のコレクションの合計量は、マスターの総量プロパティに等しくなるように、ルールを作成しようとしている</p> <pre><code>public class Master { public int? TotalAmount; public ICollection<Detail> Details; } public class Detail { public int Amount; } </code></pre> <p>:

私は、次のルールをしようとしているが、私はマスターのプロパティにアクセスすることはできません。

RuleFor(x => x.Details) 
    .Must(coll => coll.Sum(item => item.Amount) == x.TotalAmount) 
    .When(x => x.Details != null) 
    .When(x => x.TotalAmount.HasValue); 

ルールのこの種を実装するための正しい方法は何ですか?

+1

ちょうど正に計算できるものを検証するのはなぜですか?この種の検証では、とにかく計算が必要ですが、全体が複雑になります。 –

+0

@DiligentKeyPresserこの質問のためのクラスとプロパティ名は例です。 –

+0

いずれにしても、使用した具体例にかかわらず、2つの表データ間の同期を強制する必要があるという事実があります。 – Bon

答えて

1

このようにあなたは、しなければならないの別のオーバーロードを使用することができます。

RuleFor(x => x.Details) 
    .Must((master, details, ctx) => master.TotalAmount == details.Sum(r => r.Amount))    
    .When(x => x.Details != null) 
    .When(x => x.TotalAmount.HasValue); 

は、しかし、すでにコメントで指摘したように、あなたは一貫性チェックの検証を使用してはならない、ということに注意してください。 1つのデータ(詳細量の合計)があります。だからこそこのようにしないでください:

public class Master { 
    public int? TotalAmount 
    { 
     get 
     { 
      if (Details == null) 
       return null; 
      return Details.Sum(c => c.Amount); 
     } 
    } 

    public ICollection<Detail> Details; 
} 
+0

私はこれを行うことができたと私はこの方法を行くつもりだったが、POCOクラスでそのようなロジックを追加することを避けるために、モデルクラスにそのようなプロパティを追加したくなかった。 –

+0

私はそれをするのが妥当ではない場合が多いですが、とにかく私よりあなたの状況をよく知っています。 – Evk

0

私はこのタイプの検証を達成するために発見した最良の方法は、次のようなカスタム検証メソッドを使用することである:ここでのルールは全体のマスター・オブジェクトに適用されると説明されていることを

public class Validator : AbstractValidator<Master> 
{ 
    public Validator() 
    { 
     RuleFor(master => master) 
      .Must(CalculateSumCorrectly) 
      .When(master => master.Details != null) 
      .When(master => master.TotalAmount.HasValue); 
    } 

    private bool CalculateSumCorrectly(Master arg) 
    { 
     return arg.TotalAmount == arg.Details.Sum(detail => detail.Amount); 
    } 
} 

お知らせ。 RuleFor(master => master)。これは、両方のプロパティにアクセスできるトリックです。

関連する問題

 関連する問題