【发布时间】:2011-10-29 23:12:27
【问题描述】:
我正在解决保存到数据库之前更新实体的问题并得到奇怪的行为。
我在 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; }
}
每辆车都有一个 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();
有人可以解释一下,这里发生了什么吗?特别是magic在最后一段代码的第3行和第4行。
更新
我收到DbEntityValidationException:“一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性。”
来自内部异常:“OriginalValues 不能用于处于已添加状态的实体。”
【问题讨论】:
-
你注意到你有两个分号在 order.RentPrice = _context.Cars.Find(order.CarId).RentPrice;; --> 在最后一段代码的旁边?
-
SaveChanges 方法的验证错误是什么?您最初的 Create 方法中的代码对我来说很好。
-
@Jack,只是写帖子时的错别字。固定。
-
@shiznit123,我添加了异常,我得到了所有不工作的代码示例。
-
您的 post 操作的第一个代码 sn-p 是否也会给出相同的验证错误“原始值不能用于处于已添加状态的实体”?我不敢相信......如果不是,这段代码中的验证错误是什么?我相信这是重要的提示。
标签: c# entity-framework asp.net-mvc-3 ef-code-first