2012-11-08 110 views
0

此代碼爲什麼不起作用?它插入一個對象,但不會刪除它EF - 無法刪除對象

public int Toggle(RequestArchive RequestArchiveObj) 
{ 
    var ra = DataContext.RequestArchives.Where(rec => rec.UserId == RequestArchiveObj.UserId && rec.RequestId == RequestArchiveObj.RequestId); 

    if(ra.Count() > 0) 
    { 
     foreach (var item in ra) 
     {      
      DataContext.DeleteObject(item); 
     } 
    } 
    else 
    { 
     DataContext.AddToRequestArchives(RequestArchiveObj); 
    } 

    DataContext.SaveChanges(); 
    return RequestArchiveObj.Id; 
} 
+0

這是什麼樣的代碼? –

+0

@f_puras,它是一個C#方法 –

+0

你有錯誤嗎?你有沒有在'foreach'中設置一個斷點來看看你在那裏? –

回答

1

有潛在危險的問題與你的代碼,您的問題可能涉及到的是:

如果您通過查詢對象環路(由DataContext.RequestArchives.Where()返回的對象)如果不執行它,你將有一個往返循環中的每一個項目的數據庫。這被稱爲N+1 selects problem

您可以在此使用ToList()方法緩解:

var ra = DataContext.RequestArchives 
        .Where(rec => 
          rec.UserId == RequestArchiveObj.UserId && 
          rec.RequestId == RequestArchiveObj.RequestId) 
        .ToList(); // this executes the query 
// ... 
foreach (var item in ra) // without ToList() this will query every item by itself 
{      
    DataContext.DeleteObject(item); // and this might collide with the query 
} 

我不知道這一點,但也許會出現缺失問題,因爲您嘗試刪除對象,同時還通過foreach循環查詢他們。如果是這種情況,一旦您按照上面的建議使用ToList(),它應該可以正常工作。

+0

WOOOW:哦,這很聰明,謝謝丹尼斯,你的回答令我驚歎!感謝敬畏一些回答 –

+0

@AliForoughi高興地幫助 –