Cómo eliminar un objeto por id con marco de entidad

Me parece que tengo que recuperar un objeto antes de que lo elimine con el marco de entidades como a continuación

var customer = context.Customers.First(c => c.Id = 1); context.DeleteObject(customer); context.Savechanges(); 

Entonces necesito golpear la base de datos dos veces. ¿Hay alguna manera más fácil?

En Entity Framework 6, la acción de eliminación es Remove . Aquí hay un ejemplo

 Customer customer = new Customer () { Id = id }; context.Customers.Attach(customer); context.Customers.Remove(customer); context.SaveChanges(); 

Lo mismo que @Nix con un pequeño cambio para ser fuertemente tipado:

Si no desea realizar una consulta, solo cree una entidad y luego bórrela.

  Customer customer = new Customer () { Id = id }; context.Customers.Attach(customer); context.Customers.DeleteObject(customer); context.SaveChanges(); 

Si no desea consultarlo, simplemente cree una entidad y luego bórrela.

 Customer customer = new Customer() { Id = 1 } ; context.AttachTo("Customers", customer); context.DeleteObject(customer); context.Savechanges(); 

Pregunta similar aquí .

Con Entity Framework está EntityFramework-Plus (biblioteca de extensiones).
Disponible en NuGet. Entonces puedes escribir algo como:

 // DELETE all users which has been inactive for 2 years ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2)) .Delete(); 

También es útil para eliminaciones masivas.

La consulta de SQL crudo es la forma más rápida, supongo

 public void DeleteCustomer(int id) { using (var context = new Context()) { const string query = "DELETE FROM [dbo].[Customers] WHERE [id]={0}"; var rows = context.Database.ExecuteSqlCommand(query,id); // rows >= 1 - count of deleted rows, // rows = 0 - nothing to delete. } } 

Estoy usando el siguiente código en uno de mis proyectos:

  using (var _context = new DBContext(new DbContextOptions())) { try { _context.MyItems.Remove(new MyItem() { MyItemId = id }); await _context.SaveChangesAsync(); } catch (Exception ex) { if (!_context.MyItems.Any(i => i.MyItemId == id)) { return NotFound(); } else { throw ex; } } } 

De esta forma, consultará la base de datos dos veces solo si se produce una excepción al intentar eliminar el elemento con la ID especificada. Entonces, si el artículo no se encuentra, devuelve un mensaje significativo; de lo contrario, simplemente devuelve la excepción (puede manejar esto de una manera más adecuada para su caso usando diferentes bloques de captura para diferentes tipos de excepción, agregue más controles personalizados usando bloques, etc.).

[Estoy usando este código en un proyecto MVC .Net Core / .Net Core con Entity Framework Core.]

Si usa EF 1.0, esa es la forma más concisa de hacerlo. Puede haber otras formas pero son más problemas de lo que valen en mi humilde opinión.