2

エンティティに許可される関連レコードの最大数を指定する方法はありますか? たとえば、Order エンティティごとに、最大 5 つの orderItems を持つという制約を指定したいと考えています。

SQLを使用する必要がありますか、それとも流暢なapiまたはef属性に役立つものがありますか?

4

2 に答える 2

3

「注文ごとに最大 5 つの orderItems」がビジネス要件であると思います。このような要件は、インフラストラクチャ (マッピング) または sql によって実装されるべきではありません (それが何を意味するのかわかりませんが、データベース ロジックとして読んでいます)。バリデーションの原因となる属性は問題ないかもしれませんが、そのための属性はないと思います。

他のすべてのビジネス ルールと同様に、検証とフィードバックが発生するように実装する必要があります。マッピング (可能であれば) またはデータベースの制約に実装されたルールには、2 番目の検証メカニズムが必要であり、おそらく例外をキャッチしますが、これは見苦しいものです。

それに加えて、ある日、場合によっては一時的に (クリスマス?) 変更される可能性があるルールです。次に、このルールの実装をさまざまなアプリケーション層に分散させたくありません。

サービス クラスまたはリポジトリの何らかのメソッド、または Order クラス自体にルールを実装しAddItem、最大値を構成可能にします。

于 2013-01-30T19:13:49.467 に答える
1

ここで行われたことのように、これにアプローチします。

.NET で Queue<T> のサイズを制限しますか?

また: C# で List<T> の Add メソッドをオーバーライドするにはどうすればよいですか?

これを処理するには、返されたエンティティのリストを処理しているものを、ビジネス ロジック要件を実装する拡張型でオーバーライドします。これにより、将来変更する必要がある場合に、設定ファイルからプロパティを簡単に制御できるようになります。

EF / Fluent または SQL のいずれかでこれを行う方法がわかりません。これは関連するビジネス ロジックであり、データを永続化する方法には関連しないため、直感に反するようです。(※私の知らない方法がないわけではありません)

このようなものが動作するはずです:

public class LimitedList<T> : List<T> {
  private int limit = -1;

  public int Limit {
    get { return limit; }
    set { limit = value; }
  }

  private List<T> list= new List<T>();
  public LimitedList(int Limit) {
     this.Limit=Limit;
  }

  public void Add(T entry) {
     if (this.Limit != list.Count) {
       list.Add(entry);
     } else {
         //error
     }
  }
}
于 2013-01-30T17:20:06.633 に答える