0

私の SQL データベースでは、2 つのレコードを同じ番号で追加することはできません。以前に使用した番号でレコードを作成しようとしたり、以前に使用した番号を使用するようにレコードを編集しようとすると、それが許可されず、下請番号フィールドの横にアスタリスクが付いた編集/作成ページに戻ります。これにルール違反を追加して、適切なメッセージを表示できるようにしたいと考えています。これを追加してみました:

 if (db.subcontracts.Count(s => s.subcontract_no == subcontract_no) > 0)
      yield return new RuleViolation("Subcontract number already exists", "subcontract_no");

これを書いているとき、私は Create メソッドしか考えていませんでした。ここでの問題は、subcontract_no が変更されていない場合でも、レコードを編集するたびに違反が見つかることです。したがって、subcontract_no が変更された場合は、レコードの作成時と編集時に違反を見つける必要があると思います。ただし、「自分自身を見つけて」ルール違反を作成することはできません。これどうやってするの?

4

2 に答える 2

1

まず、編集/更新ページで、値を変更できない場合は、編集可能な値として表示しないでください。アクションでViewModelを取得し、DBから対応するモデルを取得し、不変フィールドを除外する制限付きでTryUpdateModelを使用することをお勧めします。次に、検証コードで、変更タイプが(挿入ではなく)更新である場合、重複する外注番号のチェックを省略します。下請け番号がすでに(初期ではない)値を持っていて、それを変更しようとすると例外をスローする下請け番号プロパティのプロパティ変更ハンドラーに結びつくコードでこれを補強します。これにより、挿入時を除いて値が設定されなくなり、更新時の検証チェックをスキップできるようになります。

これを、列に一意性を強制するDB制約と組み合わせることもできます。null以外の列の一意のインデックスが機能します。

于 2010-03-09T20:19:22.820 に答える
1

試す:

db.subcontracts.Count(s => (s.subcontract_no == subcontract_no) 
    && (s.id != actually_edited_or_created_contract.id)).Count

entity.id == nullの場合でも、新規または既存のエンティティで機能します。

于 2010-03-09T20:24:05.023 に答える