3

次のエンティティクラスがあるとします。

public class Order
{
    public int OrderID { get; set; }
    public ICollection<OrderLine> OrderLines { get; set; }
}

public class OrderLine
{
    public int OrderLineID { get; set; }
    public Order Order { get; set; }
}

この関係に最低1のカーディナリティーを適用したいと思います。つまり、少なくとも1つのOrderLineがないと注文を作成できないようにしたいのです。

私はEFコードファーストの流暢なスタイル構成を使用しており、OrderLineにはOrder参照が必要であるという事実を強制できます(HasRequired()拡張メソッドを使用)が、少なくとも1つがないとOrderが作成されないようにする方法がわかりませんOrderLine。

4

2 に答える 2

3

要するに:あなたはできません。要件をデータベース制約にマップすることはできません。注文と注文明細は別々に保存されるため、注文を作成して注文明細を追加するときは、注文または注文明細のいずれかを最初に保存する必要があります。注文明細->注文関係は外部キーによって裏付けられているため、最初に注文を保存する必要があります。注文が保存されると、データベースが知る限り、注文には注文明細がなく、後で追加されるまで追加されません。

カスタム検証関数を作成し、保存する前にそれらを呼び出すことができます。を使用している場合はObjectContext、これを自分で行う必要があります。がある場合は、DbContextをオーバーライドできるはずですDbContext.ValidateEntity。明らかな理由から、これは、コンテキストを介してすべてのデータベース変更を行った場合にのみ機能します。データベーステーブルを直接変更する場合、カスタム検証関数は使用されません。

于 2012-08-18T18:23:30.433 に答える
2

流暢な構成ではなく、それを行うことができます:

public class Order : IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(
           ValidationContext validationContext)
    {
        if (!OrderLines.Any())
            yield return new ValidationResult("At least one line needed");
    }
}

これは、プロパティやその他のモデルの制約SaveChanges()と同様に、 の場合に適用されます。Required

于 2012-08-19T00:49:23.527 に答える