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
字段?我已经编辑了我的问题,您是否可以查看它并告诉我是否有问题。