2012-10-11 10 views
8

Mam następujący i szukasz bardziej skutecznych sposobów usuwania vs przelotowego ewidencji i wtedy usunięcie każdego z nich w danym momencie (uwaga przy użyciu Dbset):Entity Framework dbset najbardziej skutecznym sposobem usuwania

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

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

    dbContext.SaveChanges(); 

Powiedz również, że mamy 1 rekord, który jest następujący:

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

Jaki jest najlepszy sposób usunięcia tego rekordu?

Próbowałem następujących ale dał błąd:

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

Potem uciekał się do robienia foreach do kasowania tylko jeden rekord, jak wykazałem powyżej, że nie jest to najbardziej skuteczny tylko 1 rekord.

+0

Jeśli nie śledzić tych podmiotów i wiem identyfikatory (i masz dużo identyfikatorów), można rozważyć użycie SQL Query. W ten sposób nie musisz przenosić jednostek do kontekstu, aby je usunąć. W pewnym sensie chodzi o EF, więc musisz odpowiedzieć na pytanie, czy warto. – Pawel

Odpowiedz

8

Aktualizacja dla EF7:

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

UPDATE maja 2015: Sprawdź zaktualizowane dokumenty na msdn i examples. Przykład kodu usunąć podmiotowi 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); 
     } 
} 

Najskuteczniejszym sposobem, jeśli znasz identyfikator i nie mają jednostka ładowany jest stworzenie fałszywego jednostkę i usunąć go

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

Ale to nie będzie pracować, jeśli naprawdę masz kilka rekordów o tym samym id i musisz użyć pola name, a także wybrać właściwy.

Również twój ostatni przykład powinien być

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

Najprawdopodobniej powinien to być dbContext.Program.First(), ponieważ w przypadku gdy zwrócony by byłby –

+0

@MarkOreta oh jeeze, nie zauważyłem nawet, że – vittore

+0

Nie zapomnij również o SaveChanges, bo inaczej Remove nie działa. –