2011-08-04 43 views
30

我想知道如何从Entity Framework 4.1中删除一个对象,而无需首先从数据库加载对象。我发现对堆栈溢出theseother 2的答案,但它们不属于EF 4.1实体框架4.1:如何删除对象Id

我曾尝试下面的代码,但它不工作

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。

+1

第一个例子有效。你在其他地方做错了事。 –

+1

Ladislav Mrnka,你能否提供一个示例项目来展示它如何为你工作。它不适合我。 – Paul

+1

我同意@Ladislav:第一个代码段必须工作。你有例外吗?哪一个?还是它默默无法删除任何东西? Car类中有复合主键吗?数据库中是否存在不允许删除汽车的限制? – Slauma

回答

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

+1

代码片段不适用于实体框架4.1。实体框架4.1没有AttachTo()或DeleteObject() – Paul

+0

那么,正如@Ladislav Mrnka所说,你的第一个例子应该工作,是相同的使用另一种语法 – Milox

+0

我知道它应该工作,但它没有。尽管它不会引发异常,但它不会从数据库中删除该行。 – Paul

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

+0

实体框架4.1没有db.Entry()方法。您正在使用Entity Framework 4.0。 – Paul

+0

嗯......是的确如此:http://msdn.microsoft.com/en-us/library/gg696578(v=vs.103).aspx –

+7

我建议你在投票前检查你使用的是什么版本。尝试使用NuGet检索最新版本。 – agradl

10

只是为了说服你,你的第一个代码段必须在这里工作是一个简单的例子,你可以复制,粘贴和测试:

  • 创建一个新的控制台应用程序项目(。 NET 4)
  • 添加参考EntityFramework.dll(EF 4.1)
  • 删除的Program.cs和对所述内容ASTE如下所示:

- >

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数据库会自动创建数据库。

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

0

下面的代码很适合我:

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

如果这个对象不是由先前的DbContext跟踪那就打数据库,否则它会在内存中找到它。