2012-10-11 84 views
8

tengo el siguiente y en busca de una manera más eficiente de borrar vs bucle a través de los registros y borrar cada uno a la vez (nota usando Dbset):Entity Framework dbset forma más eficiente de eliminación de

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

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

    dbContext.SaveChanges(); 

También diga si tenemos 1 registro que es el siguiente:

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

¿Cuál es la mejor manera de eliminar este registro?

intentado el siguiente, pero dio un error:

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

Entonces recurrieron a hacer un foreach para borrar un solo registro como he mostrado anteriormente que no es el más eficiente por sólo 1 registro.

+0

Si no realizar un seguimiento de estas entidades y conocer las identificaciones (y usted tiene una gran cantidad de identificadores), es posible considerar el uso de una consulta SQL. De esta forma, no necesita traer entidades a su contexto solo para eliminarlas. Está yendo alrededor de EF así que debes responder la pregunta si vale la pena. – Pawel

Respuesta

8

ACTUALIZACIÓN DE EF7:

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

actualización puede el año 2015: Comprobar documentos actualiza en msdn y examples. Código de ejemplo para borrar entidad con 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); 
     } 
} 

La forma más eficaz si se sabe ID y no tiene entidad cargado es crear la entidad falsa y eliminarlo

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

pero esto no será trabaje si realmente tiene varios registros con la misma identificación y necesita usar el campo name para seleccionar el correcto.

también el último ejemplo debe ser

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

Probablemente debería ser dbContext.Program.First(), ya que donde devolvería un Enumerable –

+0

@MarkOreta oh jeeze, seguro, ni siquiera se dio cuenta de que – vittore

+0

Tampoco olvides guardarCambios o de lo contrario, la opción Eliminar no funcionará. –

Cuestiones relacionadas