1

モデル上で一意である必要があるプロパティを検証する方法はありますか?たとえば、ユーザーは「製品」を作成および編集できますが、既存のProductCodeを使用して製品を作成したり、製品を編集してProductCodeを既存のコードに変更したりすることはできません。

カスタム属性を使用してみました。

public class Unique : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var products = Repository.Store.Products.Where(x => x.ProductCode == value);
        return (products.Count() == 0);
    }
}

このソリューションでカバーできるのは、コードがDBに既に存在する場合に、ユーザーが製品を挿入/更新できないようにすることだけです。これにより、ユーザーは既存の商品を編集できなくなります。送信すると、コードが既に存在していることがわかり(編集しようとしている商品のコードになります)、falseが返されます。

MVC 2で一意のインデックスを処理する方法はありませんか。何時間も検索し、stackoverflowに関する他のトピックも見つけましたが、固溶体はありません。

4

3 に答える 3

3

挿入または更新を失敗させてから、適切なエラーメッセージをユーザーに返します。チェックの直後に別のユーザーがデータベースを変更する可能性が常にあるため、事前のチェックはとにかく問題があります。

オブジェクトを挿入し、一意の制約が原因で失敗したかどうかを判断する方法の例を次に示します。

INSERT INTO MyTable (column1, column2, column3) 
    SELECT @param1, @param2, @param3
    WHERE NOT EXISTS (SELECT * FROM table WHERE id = @param4)

オブジェクトがすでに存在する場合、これにより0行が変更されます。そうでない場合は、1行を変更します。他に問題が発生した場合は、例外が発生します。これも非常に効率的です(少なくともSQLサーバーでは)。希望どおりに、インデックスシークとそれに続くインデックス更新が発生します。

于 2010-12-15T13:41:59.957 に答える
0

関連分野でMVCに少し苦労しました。

私の質問に集められた答えの一部は、オブジェクトの挿入と更新のために「おそらく」別々のモデルを持っているべきであるということでした。

そうすれば、挿入モデルだけにカスタム属性を設定できます。

それ以外の場合は、カスタム属性ではなく、insertメソッドの通常のコードチェックとしてこれを処理してください。

于 2010-12-15T13:34:52.233 に答える
0

なるほど、分かりました....

オブジェクトの一意のIDの存在を「等しくない」チェックを行うことはできますか?そのようにして、現在の製品ではなく、製品コードの存在をチェックします。

于 2010-12-15T13:57:49.587 に答える