2012-10-11 70 views
8

我有以下並尋找刪除VS通過記錄循環的一種更有效的方式,然後刪除每一次一個(使用Dbset注):實體框架dbset刪除的最有效的方式

 var wcd = dbContext.ProgramDetails.Where(p => p.Id == Id); 

    foreach (var wc in wcd.ToList()) 
    { 
     dbContext.ProgramDetails.Remove(wc); 
    } 

    dbContext.SaveChanges(); 

另請說明我們是否有1條記錄如下:

var pg = dbContext.Program.Where(p => p.Id == Id && Name == FName); 

刪除這一條記錄的最佳方法是什麼?

試過以下,但給了一個錯誤:

var pg = dbContext.Program.Where(p => p.Id == Id && Name == FName); 
    dbContext.Program.Remove(wc); 

於是我使出做一個foreach刪除一條記錄如我上面所顯示的並不是最有效的僅1記錄。

+0

如果不跟蹤這些實體和知道的ID(和你有很多的ID),你可以考慮使用一個SQL查詢。通過這種方式,您不需要將實體帶入您的上下文中即可刪除它們。這是一種EF左右,所以你需要回答這個問題是否值得。 – Pawel

回答

8

更新EF7

using (var db = new BloggingContext()) 
{ 
    var blog = db.Blogs.First(p => p.Id == Id); 
    db.Remove(blog); 
    db.SaveChanges(); 
} 

UPDATE 2015年5月:檢查msdnexamples更新文檔。示例代碼刪除實體EF6:

public async Task<ActionResult> Delete(Department department) 
{ 
     try 
     { 
      db.Entry(department).State = EntityState.Deleted; 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      return RedirectToAction("Delete", new { concurrencyError = true, id = department.DepartmentID }); 
     } 
     catch (DataException /* dex */) 
     { 
      //Log the error (uncomment dex variable name after DataException and add a line here to write a log. 
      ModelState.AddModelError(string.Empty, "Unable to delete. Try again, and if the problem persists contact your system administrator."); 
      return View(department); 
     } 
} 

,如果你知道ID和實體加載沒有最有效的方法是創建假的實體,並刪除它

var p = new Program { Id = myId } 
dbContext.Program.Remove(p) 

但這不會如果您確實有多個記錄具有相同的ID,並且您還需要使用name字段以選擇正確的字段,則可以工作。

而且你的最後一個例子應該是

var pg = dbContext.Program.First(p => p.Id == Id && p.Name == FName); 
dbContext.Program.Remove(pg); 
+0

應該可能是dbContext.Program.First(),因爲在那裏會返回一個Enumerable –

+0

@MarkOreta哦jeeze,當然,沒有注意到, – vittore

+0

也不要忘了SaveChanges或刪除不起作用。 –