.net - tools - Entity Framework 4.1: ¿Cómo elimino por identificación del objeto?
instalar entity (4)
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 golpearía la base de datos, de lo contrario lo encontraría en la memoria.
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 these other 2 respuestas en Stack Overflow, pero no pertenecen a EF 4.1
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 archivos en bruto.
Solo para convencerlo de que su primer fragmento de código debe funcionar aquí es un ejemplo simple que puede copiar, pegar y probar:
- Crear un nuevo proyecto de aplicación de consola (.NET 4)
- Agregar referencia a
EntityFramework.dll
(EF 4.1) - Elimine el contenido de
Program.cs
y pegue lo 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 tiene una base de datos de SQL Server Express, se creará automáticamente la base de datos.
Quizás esto pueda ayudarlo a comparar con su código porque parece que algo que no se ve en sus fragmentos de código está causando el comportamiento diferente que describe.
Uso lo 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());
}
utilizar entidades de código auxiliar:
public void DeleteCar(int carId)
{
var car = new Car() { Id = carId };
_dbContext.AttachTo("Cars",car);
_dbContext.DeleteObject(car);
_dbContext.SaveChanges();
}
referencia: