2011-08-04 10 views
30

Me gustaría saber cómo eliminar un objeto de Entity Framework 4.1 sin tener que cargar primero el objeto desde la base de datos. He encontrado theseother 2 respuestas sobre desbordamiento de pila, pero que no pertenecen a EF 4.1Entity Framework 4.1: cómo puedo eliminar por el Id de objeto

He probado el siguiente código, pero no funciona

public void DeleteCar(int carId) 
{ 
    var car = new Car() { Id = carId }; 
    _dbContext.Cars.Attach(car); 
    _dbContext.Cars.Remove(car); 
    _dbContext.SaveChanges(); 
} 

quiero evitar el código de abajo.

public void DeleteCar(int carId) 
{ 
    var car = context.Cars.Find(carId); 
    _dbContext.Cars.Remove(car); 
    _dbContext.SaveChanges(); 
} 

Y no quiero llamar a un procedimiento almacenado o ejecutar raw sql.

+1

El primer ejemplo funciona. Estás haciendo algo mal en otro lado. –

+1

Ladislav Mrnka, puede proporcionar un proyecto de ejemplo que muestre cómo funciona para usted. No funciona para mi – Paul

+1

Estoy de acuerdo con @Ladislav: El primer fragmento de código debe funcionar. ¿Recibes una excepción? ¿Y cuál? ¿O silenciosamente no puede eliminar nada? ¿Tienes una clave primaria compuesta en la clase Car? ¿Existe alguna restricción en el DB que no permite eliminar el auto? – Slauma

Respuesta

3

entidades utilización del trozo:

public void DeleteCar(int carId) 
{ 
    var car = new Car() { Id = carId }; 
    _dbContext.AttachTo("Cars",car); 
    _dbContext.DeleteObject(car); 
    _dbContext.SaveChanges(); 
} 

referencia:

http://blogs.msdn.com/b/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx

+1

El fragmento de código no funciona con Entity Framework 4.1. Entity Framework 4.1 no tiene AttachTo() o DeleteObject() – Paul

+0

entonces, como dijo @Ladislav Mrnka, su primer ejemplo debería funcionar, es el mismo usando otra sintaxis – Milox

+0

Sé que debería funcionar, pero no es así. Aunque no arroja una excepción, tampoco elimina la fila de la base de datos. – Paul

40

utilizo el siguiente para mis eliminaciones, funciona muy bien.

public virtual ActionResult Delete(int commentID) 
{ 
    var c = new Comment(){CommentID = commentID}; 
    db.Entry(c).State= EntityState.Deleted; 
    db.SaveChanges(); 
    return RedirectToAction(MVC.Blog.AdminComment.Index()); 
} 

enter image description here

+0

Entity Framework 4.1 no tiene el método db.Entry(). Estás usando Entity Framework 4.0. – Paul

+0

Umm ... sí lo hace: http://msdn.microsoft.com/en-us/library/gg696578(v=vs.103).aspx –

+7

Le sugiero que compruebe qué versión está utilizando antes de votar. Intenta usar NuGet para recuperar la última versión. – agradl

10

Sólo para convencerte de que tu primer fragmento de código debe trabajar aquí es un ejemplo simple puede copiar, pegar y prueba:

  • Crear un nuevo proyecto de aplicación de consola (. NET 4)
  • Agregar referencia a EntityFramework.dll (EF 4.1)
  • Eliminar el contenido de Program.cs y p aste en la siguiente:

->

using System.Data.Entity; 

namespace EFDeleteTest 
{ 
    public class Car 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class MyContext : DbContext 
    { 
     public DbSet<Car> Cars { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Database with name "EFDeleteTest.MyContext" 
      // will be created automatically in SQL Server Express 

      int carId = 0; 
      using (var context = new MyContext()) 
      { 
       var car = new Car { Name = "Test" }; 
       context.Cars.Add(car); 
       context.SaveChanges(); 

       carId = car.Id; 
      } 
      //Make breakpoint here and check that the car is indeed in the DB 

      using (var context = new MyContext()) 
      { 
       var car = new Car() { Id = carId }; 
       context.Cars.Attach(car); 
       context.Cars.Remove(car); 
       context.SaveChanges(); 
      } 
      //Make breakpoint here and check that the car 
      //indeed has been deleted from DB 
     } 
    } 
} 

Si usted tiene un expreso DB de SQL Server creará automáticamente la base de datos.

Quizás esto pueda ayudarlo a comparar con su código porque parece como si algo no visible en los fragmentos de código estuviera causando el comportamiento diferente que describe.

0

El siguiente código funciona bien para mí:

var c = db.Set<T>().Find(id); 
db.Entry(c).State = EntityState.Deleted; 
db.SaveChanges(); 

Si este objeto no fue rastreado previamente por el DbContext entonces sería golpear la base de datos, de lo contrario, se encontraría en la memoria.

Cuestiones relacionadas