2010-03-18 19 views
64

Me parece que tengo que recuperar un objeto antes de eliminar con marco de la entidad, como a continuaciónCómo borrar un objeto id con marco de la entidad

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

context.DeleteObject(customer); 

context.Savechanges(); 

Así que tenga que pulsar dos veces la base de datos. ¿Hay alguna manera más fácil?

+0

http://j.mp/f0x0Bh es su respuesta. Esta es una forma agradable y genérica de hacerlo – BritishDeveloper

Respuesta

0

Si está utilizando 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.

20

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

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

El mismo que @Nix con un pequeño cambio a tener un tipo fuerte:

Si no desea consultar para ello basta con crear una entidad, y luego eliminarlo.

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

No es perfecto ya que arroja una excepción si falta el objeto: "DbUpdateConcurrencyException: la actualización de la tienda, inserción o declaración de eliminación afectó a un número inesperado de filas (0)." Me gustaría ignorar esto, como lo haría una declaración DELETE. – Dunc

+0

lo siento, esto causa una validación que no es necesaria y siempre se espera! –

20

Pregunta similar here.

Con Entity Framework hay EntityFramework-Plus (biblioteca de extensiones).
Disponible en NuGet. A continuación, puede 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.

+18

Desafía la razón de que esto ya no sea parte de la biblioteca principal de EF. – nathanchere

+1

@FerretallicA - de acuerdo. – acarlon

+1

este método es un uso obsoleto: context.Users.Where (user => user.Id == id) .Delete(); – Manuel

4

consulta SQL crudo es manera 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. 
    } 
} 
+5

Esto anula el propósito de utilizar la funcionalidad de objetos fuertemente tipados en EF. – LawMan

+0

Esto compromete el efectivo de identidad EF. Después de esto, EF aún te devolverá tu entidad eliminada. – epox

+1

Funciona con Azure SQL DataWarehouse, cuando otras soluciones no lo hacen. –

39

En Entity Framework 6 la acción de eliminación es Remove. Este es un ejemplo

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

Esto funcionó para mí –

2

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

using (var _context = new DBContext(new DbContextOptions<DBContext>())) 
    { 
     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 manera, se consulta la base de datos dos veces sólo si se produce una excepción cuando se trata de eliminar el elemento con la identificación 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 utilizando este código en un proyecto MVC .Net Core/Core Net con Entity Framework Core.]

Cuestiones relacionadas