获取实体并将其作为参数传递给服务会导致导航属性出现问题

本文关键字:导航 属性 问题 服务 实体 参数传递 获取 | 更新日期: 2023-09-27 17:53:11

我在控制器中这样做:

public ActionResult EditOrder(OrderViewModel viewModel)
{
    var order = _orderService.GetOrderById(viewModel.Id);
    order.OrderStatus = viewModel.OrderStatus;
    _orderService.UpdateOrder(order);
    Return View(viewModel);
}

…UpdateOrder()是我的OrderService中的一个方法,它做以下事情:

public bool UpdateOrder(EcommerceOrder order)
{
    var dbOrder = _dbContext.EcommerceOrders.Find(order.Id);
    dbOrder.OrderStatus = _dbContext.EcommerceOrderStatuses.Find(order.OrderStatus.Id);
    _dbContext.SaveChanges();
    return true;
}

令人费解的是(至少对我来说),这会导致实体框架创建一个新的OrderStatus,而不是简单地设置现有的。

然而,如果我像这样改变我的控制器,它会很好地工作:

public ActionResult EditOrder(OrderViewModel viewModel)
{
    var order = new EcommerceOrder();
    order.OrderStatus = viewModel.OrderStatus;
    _orderService.UpdateOrder(order);
    Return View(viewModel);
}

知道为什么吗?

获取实体并将其作为参数传递给服务会导致导航属性出现问题

由于您保存的实体是新的,EF将假定子对象也是新的。

试着把:

_dbContext.Entry(order.orderStatus).State = EntityState.Modified;

在save changes call之前