2016-08-01 87 views
0

下面的代碼永遠不會刪除順序,即使最後一個項目被刪除 - 爲什麼?如果沒有更多項目,我想刪除命令?移除項目,如果訂單沒有更多的項目,然後刪除整個訂單

int orderItemId = 5; 
    OrderItem orderItem = DbContext.OrderItem.Find(orderItemId); 
    Order order = DbContext.Order.Find(orderItem.OrderId); 

    DbContext.OrderItem.Remove(orderItem); 

    if (DbContext.OrderItem.Count(x => x.OrderId == order.Id) == 0) 
    { 
      DbContext.Order.Remove(order); 
    } 

    DbContext.SaveChanges(); 

回答

0

您需要先獲取要刪除的項目,然後進行刷新。試試這個作爲一個更強大的解決方案,並告訴我,你會得到什麼結果:

var id = "2"; 
var orderItem = db.OrderItems.SingleOrDefault(item => item.Id == id); 

if(orderItem != null) 
{ 
    // The items exists. So we remove it and calling 
    // the db.SaveChanges this will be removed from the database. 
    db.OrderItems.Remove(orderItem); 
    db.SaveChanges(); 

    // Refresh or update any visible data with the new data source. 
    refreshGrid(); 
} 
else { 
    // Replace orderItem.Id with identifying order item property. 
    Console.WriteLine(
     String.Format("Attempted to remove order {0}, but it could not be found.", orderItem.Id) 
    ); 
} 
+0

什麼是refreshGrid? – MrChudz

+0

用新數據刷新您顯示的任何數據源的方法。舉個例子,我會添加更多的代碼註釋。 –

1
DbContext.OrderItem.Remove(orderItem); // [1] 

if (DbContext.OrderItem.Count(x => x.OrderId == order.Id) == 0) // [2] 
{ 
    DbContext.Order.Remove(order); 
} 

DbContext.SaveChanges(); // [3] 

當您從OrderItem集合中刪除orderItem[1]線,它實際上沒有在數據庫中刪除。項目將被刪除只有SaveChanges()電話[3]線。在此之前,orderItem只是用於刪除,但未刪除。

但是當您查詢[2]行上的項目數時 - 從數據庫中查詢,該數據庫是sll包含orderItem

您需要檢查現有項目之前將更改提交到數據庫:

DbContext.OrderItem.Remove(orderItem); 
DbContext.SaveChanges(); 

if (!DbContext.OrderItem.Any(x => x.OrderId == order.Id)) 
{ 
    DbContext.Order.Remove(order); 
    DbContext.SaveChanges(); 
} 
+0

但是如果在IF語句中的DbContext.SaveChanges()期間發生錯誤呢?數據庫中會有沒有項目的訂單。 – MrChudz

+0

@MrChudz以任何方式,如果沒有事務,兩個後續更新不能是原子。 EF沒有任何魔力。您要求刪除兩個表中的項目,EF將執行兩個單獨的刪除操作。在您的特定情況下,您必須在查詢現有項目之前執行一次刪除操作並進行相應的刪除操作。而把它作爲原子操作的唯一方法是交易。 – lorond

+0

@MrChudz順便說一句,'Any'會比'Count'更合適(並且稍快),因爲它會生成'select top 1 ...'查詢。如果您至少有一個項目已經找到並且足夠用於您的支票,則無需掃描整個表格/索引。更新答案以引用該答案。 – lorond