如何使用具有唯一约束的 EF4 编辑 MVC5 中的实体


[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 搭建的控制器方法脚手架我的"汽车"实体有一个独特的字段:车牌。我对我的实体进行了自定义验证:

验证:

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

问题:

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

一个或多个实体的验证失败。看 "实体验证错误"属性以获取更多详细信息。

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

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

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

好吧,

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

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

这确实解决了我的问题,但不知何故,我认为应该有一个更干净的修复程序。

最新更新