实体框架4.1:如何按对象ID删除

时间:2011-08-04 21:43:23

标签: .net entity-framework entity-framework-4.1

我想知道如何在不首先从数据库加载对象的情况下从Entity Framework 4.1中删除对象。我在Stack Overflow上找到了these other 2个答案,但它们与EF 4.1无关

我尝试了以下代码,但它不起作用

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

我想避免使用下面的代码。

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

我不想调用存储过程或执行原始sql。

4 个答案:

答案 0 :(得分:40)

我使用以下内容删除,效果很好。

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

答案 1 :(得分:10)

只是为了说服您,您的第一个代码段必须在此处运行,这是一个可以复制,粘贴和测试的简单示例:

  • 创建一个新的控制台应用程序项目(.NET 4)
  • 添加对EntityFramework.dll(EF 4.1)
  • 的引用
  • 删除Program.cs的内容并粘贴以下内容:

- >

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
        }
    }
}

如果您有SQL Server Express DB,它将自动创建数据库。

也许这可能会帮助您与代码进行比较,因为它看起来好像代码片段中不可见的内容会导致您描述的不同行为。

答案 2 :(得分:3)

使用存根实体:

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

参考:

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

答案 3 :(得分:0)

以下代码适用于我:

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

如果DbContext以前没有跟踪过这个对象,那么它会命中数据库,否则会在内存中找到它。