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);
    }

问题:

每次我编辑汽车时,都会引发错误:

一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性。

该错误是我的验证引发的错误,说它无法编辑,因为已经有一辆带有该牌照的汽车。

如果有人能指出我正确的方向来解决这个问题,那就太好了!我搜索了但找不到任何东西,所以即使是相关的帖子也欢迎!

注意:这个字段有一个唯一的约束,所以这个验证仍然必须为创建操作触发

4

1 回答 1

0

好吧,我找到了一个修复方法,但我不确定它是否是有史以来最好的。我修改了验证,使其仅在 Id 不存在时触发(所以.. 0)。这样,我可以区分新实体和更新实体。

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

这确实解决了我的问题,但不知何故,我认为应该有一个更清洁的解决方案。

于 2012-09-12T09:47:10.743 回答