我正在解决保存到数据库之前更新实体的问题,并得到了奇怪的行为。
我在ASP.NET MVC 3 Web应用程序中使用Entity Framework 4.1 Code-First。这是模型:
public class Order
{
public int OrderId { get; set; }
public int CarId { get; set; }
public DateTime BeginRentDate { get; set; }
public DateTime EndRentDate { get; set; }
public decimal RentPrice { get; set; }
public virtual Car Car { get; set; }
}
public class Car
{
public int CarId { get; set; }
public string Brand { get; set; }
public string Model { get; set; }
public string NumberPlate { get; set; }
public decimal RentPrice { get; set; }
}
每辆车都有一个租赁价格。在创建订单时,应将此价格复制到订单的租赁价格中。用户选择车辆,因此最初订单的租赁价格为0。
在这里,我想复制价格值:
[HttpPost]
public ActionResult Create(Order order)
{
order.RentPrice = _context.Cars.Find(order.CarId).RentPrice;
if (ModelState.IsValid)
{
_context.Orders.Add(order);
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(order);
}
由于实体存在验证错误,因此无法正常工作,这是由于SaveChanges
上发生了错误。好的。我发现需要先调用UpdateModel(order);
,然后再更改值。
所以我有一个有效的代码:
_context.Orders.Add(order);
UpdateModel(order);
order.RentPrice = 777;
_context.SaveChanges();
不能工作的代码:
_context.Orders.Add(order);
UpdateModel(order);
order.RentPrice = _context.Cars.Find(order.CarId).RentPrice;
_context.SaveChanges();
可工作的代码:
_context.Orders.Add(order);
UpdateModel(order);
var t = (double)_context.Cars.Find(order.CarId).RentPrice;
order.RentPrice = (decimal)t;
_context.SaveChanges();
请问有人能解释一下这里发生了什么吗?特别是最后一段代码中第三行和第四行的magic。
更新
我得到了DbEntityValidationException
:"验证一个或多个实体失败。有关更多详细信息,请参见'EntityValidationErrors'属性。"
从内部异常来看:"Added"状态的实体不能使用OriginalValues。