2016-08-01 2 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

最初に削除してから更新する必要があります。より堅牢なソリューションとしてこれを試してみて、あなたが得る結果を教え:あなたは[1]ライン上OrderItemコレクションからorderItemを削除すると

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] 

、それが実際にデータベースに削除されません。アイテムは、行のSaveChanges()コールでのみ削除されます。それまでは、orderItemは削除のために転記されましたが削除されません。

しかし、[2]行のアイテムの数を照会すると、それはデータベースから照会されます。これはシルクであり、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どんな意味でも、2つの結果的な更新は、トランザクションなしでアトミックであることはできません。 EFはどんな魔法もありません。 2つのテーブルからアイテムの削除を要求すると、EFは2つの別々の削除を実行します。特定のケースでは、既存のアイテムを照会する前に1つの削除を実行し、削除を実行する必要があります。原子操作としてそれを行う唯一の方法はトランザクションです。 – lorond

+0

@MrChudzちなみに、 '選択トップ1 ...'クエリを生成するので、 'Any'は' Count'より適切です(そして少し速い)。少なくとも1つのアイテムがすでに見つかっていて、あなたのチェックに十分なものがあれば、テーブル/インデックス全体をスキャンする必要はありません。それを参照するように更新されました。 – lorond

関連する問題