Entity Framework 4.1: How do I delete by object Id

26,297

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());
}

enter image description here

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:

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

Share:
26,297
Paul
Author by

Paul

Full stack web developer specializing in Ruby on Rails, EmberJS, AngularJS, BackBone, JavaScript, CoffeeScript, and jQuery

Updated on July 31, 2020

Comments

  • Paul
    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
      Ladislav Mrnka over 12 years
      The first example works. You are doing something wrong elsewhere.
    • Paul
      Paul over 12 years
      Ladislav Mrnka, can you provide an example project showing how it works for you. It doesn't work for me.
    • Slauma
      Slauma over 12 years
      I 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
      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
      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
      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
      agradl over 12 years
      provide some more code, like your DbContext class and the entity
  • Paul
    Paul over 12 years
    The code snippet does not work with Entity Framework 4.1. Entity Framework 4.1 does not have AttachTo() or DeleteObject()
  • Juan Jimenez
    Juan Jimenez over 12 years
    then, as @Ladislav Mrnka said, your first example should work, is the same using another syntax
  • Paul
    Paul over 12 years
    Entity Framework 4.1 does not have db.Entry() method. You're using Entity Framework 4.0.
  • Paul
    Paul over 12 years
    I 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
    Daniel Pratt over 12 years
  • agradl
    agradl over 12 years
    I suggest you check what version you are using before you down vote. Try using NuGet to retrieve the latest version.
  • lkurylo
    lkurylo over 9 years
    Great. This is what I was looking for :)