Я решаю проблему с обновлением объекта перед сохранением в базу данных и получаю странное поведение.
Я использую Entity Framework 4.1 Code-First в веб-приложении ASP.NET MVC 3. Вот модель:
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. Эта цена должна быть скопирована в 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 нельзя использовать для сущностей в состоянии« Добавлен ».