Entity framework 保存实体时引发EntityValidationException

Entity framework 保存实体时引发EntityValidationException,entity-framework,asp.net-mvc-4,c#-4.0,Entity Framework,Asp.net Mvc 4,C# 4.0,我在catch(异常e)中调试时收到此消息。当用户填写所有信息时,地址和付款视图将获得销售订单ID并重定向到完整视图。但是当它完成时,它没有显示完整的 [HttpPost] public ActionResult AddressAndPayment(SalesOrderHeader order,Customer customer, Address address ,FormCollection values) { ViewBag.Pers

我在
catch(异常e)
中调试时收到此消息。当用户填写所有信息时,
地址和付款
视图
将获得
销售订单ID
并重定向到完整视图。但是当它完成时,它没有显示完整的

[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);
            }
我只想在保存
订单
时,它将重定向到
完成
。但在这种情况下,情况并非如此。下面是
地址
型号:

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; }
    }
公共部分类地址
{
公共广播
{
this.SalesOrderHeaders=new HashSet();
this.SalesOrderHeaders1=new HashSet();
}
public int AddressID{get;set;}
公共字符串AddressLine1{get;set;}
公共字符串AddressLine2{get;set;}
公共字符串City{get;set;}
public int StateProvinceID{get;set;}
公共字符串PostalCode{get;set;}
public System.Guid rowguid{get;set;}
[必需()]
公共可为空的ModifiedDate{get;set;}
公共虚拟StateProvince StateProvince{get;set;}
公共虚拟ICollection SalesOrderHeaders{get;set;}
公共虚拟ICollection SalesOrderHeaders1{get;set;}
}

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

通过使用
ModelState
,您可以很容易地做到这一点,它应该能够捕获它。如果没有,我将代码添加到catch块中以捕获它,并使用
ModelState.addmodeleror
再次显示带有错误的页面

 [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);
}
对于我的回答,我假设属性
PostalCode
PersonType
属于
string
类型,并且定义为
不可为空

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

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


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

是否尝试将逻辑包装在
if(ModelState.IsValid){//add order and redirect}返回视图(order);//显示错误
?这将捕获EF验证错误。当您确实收到EF验证错误时,您应该再次显示表单,并且不要继续,因为如果上一页失败,那么显示下一页可能没有任何意义。
[必需(ErrorMessage=“PostalCode is Required”)]公共字符串PostalCode{get;set;}
。我这样修复了它,但它仍然出现错误,并且它有一条
错误消息=“PostalCode字段是必需的。”
@TrungPham您在保存实体时是否检查了PostalCode上设置的值?
Nullable:False
当我将其设置为真时,它会收到一个错误,导致实体不匹配@Jehof@TrungPham请阅读RequiredAttribute的文档->我在
公共NullableModifiedDate{get;set;}上面放置了一个
[Require()]
地址中的
型号。它仍然有那个错误,我不知道@jehoff谢谢你的时间!我仍然收到一个错误
error Message=“PostalCode字段是必需的。”
您知道如何解决它吗?@TrungPham您在视图中看到了吗?您应该这样做,因为这意味着您的模型要求该字段具有值,而您没有提交值,或者它无法将表单字段映射到您的对象(表单字段名称中的拼写错误?)。你能做一个断点并验证你的模型没有空字段吗?
@Html.DisplayNameFor(model=>model.Address.ModifiedDate):@Html.Kendo().DatePicker().Name(“ModifiedDate”)@Html.ValidationMessageFor(m=>m.Address.ModifiedDate)
。我就这样在视线中站稳了。错了吗?因为它仍然抛出了一个旧错误。@TrungPham看起来不错,您的视图中是否也有
PostalCode
字段?我已经编辑了我的问题,您是否可以查看它并告诉我是否有问题。