如何使用具有唯一约束的EF5在MVC4中编辑实体?

时间:2012-09-12 09:37:05

标签: validation asp.net-mvc-4 entity-framework-5

[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'属性以获取更多详细信息。

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

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

注意:此字段具有唯一约束,因此必须仍然为创建操作触发此验证

1 个答案:

答案 0 :(得分:0)

好吧我找到了解决办法,但我不确定它是有史以来最好的。 我修改了验证,以便它只在Id非exresnd时触发(所以.. 0)。 通过这种方式,我可以在新实体和更新实体之间产生干扰。

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

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