エンティティに許可される関連レコードの最大数を指定する方法はありますか? たとえば、Order エンティティごとに、最大 5 つの orderItems を持つという制約を指定したいと考えています。
SQLを使用する必要がありますか、それとも流暢なapiまたはef属性に役立つものがありますか?
エンティティに許可される関連レコードの最大数を指定する方法はありますか? たとえば、Order エンティティごとに、最大 5 つの orderItems を持つという制約を指定したいと考えています。
SQLを使用する必要がありますか、それとも流暢なapiまたはef属性に役立つものがありますか?
「注文ごとに最大 5 つの orderItems」がビジネス要件であると思います。このような要件は、インフラストラクチャ (マッピング) または sql によって実装されるべきではありません (それが何を意味するのかわかりませんが、データベース ロジックとして読んでいます)。バリデーションの原因となる属性は問題ないかもしれませんが、そのための属性はないと思います。
他のすべてのビジネス ルールと同様に、検証とフィードバックが発生するように実装する必要があります。マッピング (可能であれば) またはデータベースの制約に実装されたルールには、2 番目の検証メカニズムが必要であり、おそらく例外をキャッチしますが、これは見苦しいものです。
それに加えて、ある日、場合によっては一時的に (クリスマス?) 変更される可能性があるルールです。次に、このルールの実装をさまざまなアプリケーション層に分散させたくありません。
サービス クラスまたはリポジトリの何らかのメソッド、または Order クラス自体にルールを実装しAddItem
、最大値を構成可能にします。
ここで行われたことのように、これにアプローチします。
また: 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
}
}
}