0
[HttpPost]
        public ActionResult Edit(Car car)
        {
            if (ModelState.IsValid)
            {
                db.Entry(car).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(car);
        }

これは、MCV 4 によってスキャフォールディングされたコントローラー メソッドです。私の「車」エンティティには、LicensePlate という固有のフィールドがあります。エンティティにカスタム検証があります:

検証:

public partial class Car
    {
        partial void ValidateObject(ref List<ValidationResult> validationResults)
        {
            using (var db = new GarageIncEntities())
            {
                if (db.Cars.Any(c => c.LicensePlate.Equals(this.LicensePlate)))
                {
                    validationResults.Add(
                        new ValidationResult("This licenseplate already exists.", new string[]{"LicensePlate"}));
                }
            }
        }
    }

それは役に立つはずです、私の車のエンティティ:

 public partial class Car:IValidatableObject
    {
        public int Id { get; set; }
        public string Color { get; set; }
        public int Weight { get; set; }
        public decimal Price { get; set; }
        public string LicensePlate { get; set; }
        public System.DateTime DateOfSale { get; set; }
        public int Type_Id { get; set; }
        public int Fuel_Id { get; set; }

        public virtual CarType Type { get; set; }
        public virtual Fuel Fuel { get; set; }



        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
            {
                var result = new List<ValidationResult>();
                ValidateObject(ref result);
                return result;
            }

        partial void ValidateObject(ref List<ValidationResult> validationResults);
    }

質問:

車を編集するたびに、エラーが発生します。

1 つ以上のエンティティの検証に失敗しました。詳細については、「EntityValidationErrors」プロパティを参照してください。

エラーは私の検証で発生したもので、そのナンバー プレートの車が既に存在するため編集できないと言っています。

誰かがこれを修正するために正しい方向に私を向けることができれば、それは素晴らしいことです! 検索しても出てこなかったので、関連記事でも大歓迎です!

注: このフィールドには一意の制約があるため、この検証が create-action に対して引き続きトリガーされることが不可欠です。

4

1 に答える 1

0

わかりました修正を見つけましたが、これまでで最高かどうかはわかりません。Id が存在しない場合 (so.. 0) にのみトリガーされるように、検証を変更しました。このようにして、新しいエンティティと更新されたエンティティを区別できます。

if (db.Cars.Any(c => c.LicensePlate.Equals(this.LicensePlate) && c.Id != this.Id))

これで問題は解決しますが、どういうわけか、よりクリーンな修正が必要だと思います。

于 2012-09-12T09:47:10.743 に答える