我正在解決保存到數據庫之前更新實體的問題,並得到了奇怪的行爲。實體框架代碼中的奇怪實體更新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,寫文章時只是一個錯別字。固定。 –