Странное обновление сущности в Entity Framework Code-First

Я решаю проблему с обновлением объекта перед сохранением в базу данных и получаю странное поведение.

Я использую 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 Заказа при ее создании. Автомобиль выбирается пользователем, поэтому изначально 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 , у этого объекта есть ошибки проверки. OK. Я обнаружил, что сначала нужно вызвать 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 ​​не могут использоваться для сущностей в состоянии« Добавлено ».

6
задан Kyrylo M 18 August 2011 в 19:15
поделиться