我正在解决保存到数据库之前更新实体的问题,并得到了奇怪的行为。实体框架代码中的奇怪实体更新Code-First
我在ASP.NET MVC 3 Web应用程序中使用实体框架4.1代码优先。这里是模型:
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; }
}
每辆车都有RentPrice。这个价格在创建时应该被复制到Order的RentPrice。这款车是由用户选择所以最初Order.RentPrice为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();
有人可以解释,请,这到底是怎么回事呢?尤其是魔法在最后一块代码中的第3和第4行。
更新
我得到DbEntityValidationException
:“验证失败的一个或多个实体参见‘EntityValidationErrors’属性的更多详细信息。” 从内部异常:“OriginalValues不能用于添加状态的实体。”
你有没有注意到你在order.RentPrice = _context.Cars.Find(order.CarId)结束了两个分号.RentPrice ;; - >在最后一块代码旁边? – Jack
SaveChanges方法的验证错误是什么?您最初的Create方法中的代码适合我。 – agradl
@Jack,写文章时只是一个错别字。固定。 –