Entity Framework 4.1: How do I delete by object Id
Solution 1
I use the following for my deletes, works great.
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());
}
Solution 2
Just to convince you that your first code snippet must work here is a simple example you can copy, paste and test:
- Create a new console application project (.NET 4)
- Add reference to
EntityFramework.dll
(EF 4.1) - Delete the content of
Program.cs
and paste in the following:
->
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
}
}
}
If you have a SQL Server Express DB it will automatically create the DB.
Perhaps this might help you to compare with your code because it looks as if something not visible in your code fragments is causing the different behaviour you describe.
Solution 3
use stub entities:
public void DeleteCar(int carId)
{
var car = new Car() { Id = carId };
_dbContext.AttachTo("Cars",car);
_dbContext.DeleteObject(car);
_dbContext.SaveChanges();
}
reference:
Paul
Full stack web developer specializing in Ruby on Rails, EmberJS, AngularJS, BackBone, JavaScript, CoffeeScript, and jQuery
Updated on July 31, 2020Comments
-
Paul almost 4 years
I would like to know how to delete an object from Entity Framework 4.1 without first having to load the object from the database. I have found these other 2 answers on Stack Overflow, but they do not pertain to EF 4.1
I have tried the following code but it does not work
public void DeleteCar(int carId) { var car = new Car() { Id = carId }; _dbContext.Cars.Attach(car); _dbContext.Cars.Remove(car); _dbContext.SaveChanges(); }
I want to avoid the code below.
public void DeleteCar(int carId) { var car = context.Cars.Find(carId); _dbContext.Cars.Remove(car); _dbContext.SaveChanges(); }
And I do not want to call a stored procedure or execute raw sql.
-
Ladislav Mrnka over 12 yearsThe first example works. You are doing something wrong elsewhere.
-
Paul over 12 yearsLadislav Mrnka, can you provide an example project showing how it works for you. It doesn't work for me.
-
Slauma over 12 yearsI agree with @Ladislav: The first code snippet must work. Do you get an exception? And which one? Or does it silently fail to delete anything? Do you have a composite primary key in the Car class? Is there a constraint perhaps in the DB which doesn't allow to delete the car?
-
Paul over 12 years@Slauma, do you have an example app that shows that it works? I agree it should work, but it's not. I do not have a composite primary key. It's just a regular int.
-
Slauma over 12 years@Paul: The example, I would provide, is exactly your first code snippet. What does it mean that it "does not work"? Do you get an exception?
-
Paul over 12 years@Slauma it does not work because it doesn't delete the row from the database. It does not throw an exception nor does it delete the row
-
agradl over 12 yearsprovide some more code, like your DbContext class and the entity
-
-
Paul over 12 yearsThe code snippet does not work with Entity Framework 4.1. Entity Framework 4.1 does not have AttachTo() or DeleteObject()
-
Juan Jimenez over 12 yearsthen, as @Ladislav Mrnka said, your first example should work, is the same using another syntax
-
Paul over 12 yearsEntity Framework 4.1 does not have db.Entry() method. You're using Entity Framework 4.0.
-
Paul over 12 yearsI know it should work but it doesn't. Although it doesn't throw an exception, it doesn't delete the row from the database either.
-
Daniel Pratt over 12 yearsUmm...yes it does: msdn.microsoft.com/en-us/library/gg696578(v=vs.103).aspx
-
agradl over 12 yearsI suggest you check what version you are using before you down vote. Try using NuGet to retrieve the latest version.
-
lkurylo over 9 yearsGreat. This is what I was looking for :)