【问题标题】:EntityValidationException is thrown when saving my entity保存我的实体时引发实体验证异常
【发布时间】:2014-03-12 07:08:30
【问题描述】:

我在catch (Exception e) 中调试时收到此消息。当用户填写所有信息时,Address and PaymentView 将获得SalesOrderID 并重定向到完整视图。但是完成后并没有显示完成。

[HttpPost]
        public ActionResult AddressAndPayment(SalesOrderHeader order,Customer customer, Address address ,FormCollection values)
        {
             ViewBag.PersonType = new SelectList(new[] { "EM", "SC", "VC", "IN" } // work
                                                    .Select(x => new { value = x, text = x }),
                                                    "value", "text");
            try
            {
                if (string.Equals(values["PromoCode"], PromoCode, StringComparison.OrdinalIgnoreCase) == false)
                {
                    return View(order);
                }
                else
                {
                    order.AccountNumber = User.Identity.Name;
                    order.OrderDate = DateTime.Now;
                    address.ModifiedDate = DateTime.Now; // maybe this error
                    order.Address.PostalCode = "12345";

                    //Save Order
                    BikeDBs.SalesOrderHeaders.Add(order);
                    try
                    {
                        BikeDBs.SaveChanges();
                    }
                    catch (DbEntityValidationException e)
                    {
                        foreach (var entityValidationErrors in e.EntityValidationErrors)
                        {
                            foreach (var validationError in entityValidationErrors.ValidationErrors)
                            {
                                Console.WriteLine("Properties: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                            }
                        }
                    }
                    //Process Order
                    var cart = ShoppingCart.GetCart(this.HttpContext);
                    cart.CreateOrder(order);
                    //cart.CreateOrder(order1);
                    return RedirectToAction("Complete", new { id = order.SalesOrderID });
                }
            }
            catch (Exception exception)
            {
                //Invalid - redisplay with errors
                return View(order);
            }

我想要的只是当Order 被保存时,它会重定向到Complete。但在这种情况下,它不是。这是Address模型:

public partial class Address
    {
        public Address()
        {
            this.SalesOrderHeaders = new HashSet<SalesOrderHeader>();
            this.SalesOrderHeaders1 = new HashSet<SalesOrderHeader>();
        }

        public int AddressID { get; set; }
        public string AddressLine1 { get; set; }
        public string AddressLine2 { get; set; }
        public string City { get; set; }
        public int StateProvinceID { get; set; }
        public string PostalCode { get; set; }
        public System.Guid rowguid { get; set; }
        [Required()]
        public Nullable<System.DateTime> ModifiedDate { get; set; }

        public virtual StateProvince StateProvince { get; set; }
        public virtual ICollection<SalesOrderHeader> SalesOrderHeaders { get; set; }
        public virtual ICollection<SalesOrderHeader> SalesOrderHeaders1 { get; set; }
    }

什么是解决方案以及如何解决?

【问题讨论】:

  • 您是否尝试过将您的逻辑包装在if(ModelState.IsValid){ // add order and redirect } return View(order); // show errors 中?这应该捕获您的 EF 验证错误。当您确实收到 EF 验证错误时,无论如何您都应该再次显示该表单并且不要继续,因为如果前一个页面失败,那么显示下一页可能没有任何意义。

标签: entity-framework asp.net-mvc-4 c#-4.0


【解决方案1】:

您可以通过使用ModelState 轻松完成此操作,它应该会捕获它。如果不是,我将代码添加到您的 catch 块中以捕获它并使用 ModelState.AddModelError 再次显示带有错误的页面。

 [HttpPost]
public ActionResult AddressAndPayment(SalesOrderHeader order,Customer customer, Address address ,FormCollection values)
{
    ViewBag.PersonType = new SelectList(new[] { "EM", "SC", "VC", "IN" } // work
                                                .Select(x => new { value = x, text = x }),
                                                "value", "text");
    if(ModelState.IsValid)
    {
        try
        {
            if (string.Equals(values["PromoCode"], PromoCode, StringComparison.OrdinalIgnoreCase) == false)
            {
                return View(order);
            }
            else
            {
                order.AccountNumber = User.Identity.Name;
                order.OrderDate = DateTime.Now;
                order.Address.PostalCode = values["PostalCode"];

                //Save Order
                BikeDBs.SalesOrderHeaders.Add(order);
                try
                {
                    BikeDBs.SaveChanges();
                }
                catch (DbEntityValidationException e)
                {
                    foreach (var entityValidationErrors in e.EntityValidationErrors)
                    {
                        foreach (var validationError in entityValidationErrors.ValidationErrors)
                        {
                            // If this far add errors to model errors and show view again.
                            ModelState.AddModelError(validationError.PropertyName, validationError.ErrorMessage);
                            Console.WriteLine("Properties: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                        }
                    }
                    return View(order);
                }
                //Process Order
                var cart = ShoppingCart.GetCart(this.HttpContext);
                cart.CreateOrder(order);
                //cart.CreateOrder(order1);
                return RedirectToAction("Complete", new { id = order.SalesOrderID });
            }
        }
        catch (Exception exception)
        {
            //Invalid - redisplay with errors
            return View(order);
        }
    }
    return View(order);
}

【讨论】:

  • 感谢您的宝贵时间!我还有一个错误Error Message = "The PostalCode field is required."你知道怎么解决吗?
  • @TrungPham 你在视图上看到了吗?您应该这样做,因为这意味着您的模型要求该字段具有值并且您没有提交值,或者它无法将表单字段映射到您的对象(表单字段名称中的错字?)。你能做一个断点并验证你的模型没有空字段吗?
  • @Html.DisplayNameFor(model =&gt; model.Address.ModifiedDate): @Html.Kendo().DatePicker().Name("ModifiedDate") @Html.ValidationMessageFor(m =&gt; m.Address.ModifiedDate)。我是这样在视图中设置的。这是错的吗?因为它仍然抛出一个旧错误。
  • @TrungPham 看起来不错,您的视图中是否也包含 PostalCode 字段?
  • 我已经编辑了我的问题,您能否查看它,如果我有问题,请告诉我。
【解决方案2】:

对于我的回答,我假设属性 PostalCodePersonType 的类型为 string,并定义为 not nullable

我认为您收到的错误消息清楚地说明了问题所在。属性PostalCodePersonType 是必需的,这意味着它们需要具有null 以外的值。

因此,当您未将属性设置为 null 以外的值并尝试保存实体时,您将收到错误消息。

要修复它,您需要将属性设置为某些值(可能是默认值),或者您必须更改 EntityModel 以指定这些属性为 nullable

【讨论】:

  • [Required(ErrorMessage = "PostalCode is required")] public string PostalCode { get; set; }。我就这样修复了它,但它仍然出现错误并且它有一个Error Message = "The PostalCode field is required."
  • @TrungPham 保存实体时是否检查了 PostalCode 上设置的值?
  • Nullable: False 当我将其设置为 true 时出现错误,导致实体不匹配 @Jehof
  • @TrungPham 请阅读RequiredAttribute的文档->msdn.microsoft.com/de-de/library/…
  • 我在public Nullable&lt;System.DateTime&gt;ModifiedDate {get; set;} 上方的Address 模型中放置了一个[Require()]。它仍然有那个错误,我不知道@Jehof
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2023-03-08
  • 1970-01-01
  • 2016-06-18
  • 2018-01-25
相关资源
最近更新 更多