1

我在我的控制器這樣做:抓取的實體,並把它當作參數傳遞給服務會導致導航屬性的問題

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); 
} 

任何想法,爲什麼?

回答

-1

因爲您保存的實體是新的,所以EF會假設子對象也是新的。

嘗試把:

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

的保存更改致電前。

+0

這不起作用。我試圖保存的實體並不新鮮。我從上下文中獲取實體:var dbOrder = _dbContext.EcommerceOrders.Find(order.Id)。 – tocqueville