如何使用实体框架通过id删除对象

时间:2010-03-18 16:11:55

标签: entity-framework entity

在我看来,在使用下面的实体框架删除它之前我必须检索一个对象

var customer = context.Customers.First(c => c.Id == 1);

context.DeleteObject(customer);

context.Savechanges();

所以我需要两次点击数据库。有更简单的方法吗?

9 个答案:

答案 0 :(得分:72)

在Entity Framework 6中,删除操作为Remove。这是一个例子

Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.Remove(customer);
context.SaveChanges();

答案 1 :(得分:51)

与@Nix相同,只需稍加改动即可进行强类型化:

如果您不想查询它,只需创建一个实体,然后将其删除。

                Customer customer = new Customer () { Id = id };
                context.Customers.Attach(customer);
                context.Customers.DeleteObject(customer);
                context.SaveChanges();

答案 2 :(得分:23)

类似问题here

使用实体框架,有EntityFramework-Plus(扩展库) 可在NuGet上使用。然后你可以写下这样的东西:

// DELETE all users which has been inactive for 2 years
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2))
     .Delete();

它对批量删除也很有用。

答案 3 :(得分:22)

如果您不想查询它,只需创建一个实体,然后将其删除。

Customer customer  = new Customer() {  Id = 1   } ; 
context.AttachTo("Customers", customer);
context.DeleteObject(customer);
context.Savechanges();

答案 4 :(得分:5)

我在我的一个项目中使用以下代码:

    using (var _context = new DBContext(new DbContextOptions<DBContext>()))
    {
        try
        {
            _context.MyItems.Remove(new MyItem() { MyItemId = id });
            await _context.SaveChangesAsync();
        }
        catch (Exception ex)
        {
            if (!_context.MyItems.Any(i => i.MyItemId == id))
            {
                return NotFound();
            }
            else
            {
                throw ex;
            }
        }
    }

这样,只有在尝试删除具有指定ID的项目时发生异常时,它才会查询数据库两次。然后,如果找不到该项,则返回有意义的消息;否则,它只会抛出异常(您可以使用不同的异常类型的不同catch块以更适合您的情况的方式处理它,使用if块等添加更多自定义检查。)

[我在具有Entity Framework Core的MVC .Net Core / .Net Core项目中使用此代码。]

答案 5 :(得分:2)

原始的SQL查询是我想的最快的方式

public void DeleteCustomer(int id)
{
   using (var context = new Context())
   {
      const string query = "DELETE FROM [dbo].[Customers] WHERE [id]={0}";
      var rows = context.Database.ExecuteSqlCommand(query,id);
      // rows >= 1 - count of deleted rows,
      // rows = 0 - nothing to delete.
   }
}

答案 6 :(得分:2)

此答案实际上取自Scott Allen的名为ASP.NET MVC 5基础知识的课程。我想分享一下,因为它比这里的任何答案都更简单,更直观。还要注意,根据Scott Allen和我所做的其他培训,find方法是从数据库中检索资源的一种优化方法,如果已经检索到该资源,则可以使用缓存。在此代码中,集合是指对象的DBSet。对象可以是任何通用对象类型。

        var object = context.collection.Find(id);  
        context.collection.Remove(object);
        context.SaveChanges();

答案 7 :(得分:0)

如果您使用的是EF 1.0,那么这是最简洁的方法。可能还有其他方式,但他们比恕我直言更麻烦。

答案 8 :(得分:0)

dwkd的答案主要在Entity Framework核心中为我工作,除非我看到此异常:

  

InvalidOperationException:实体类型“ Customer”的实例不能   被跟踪,因为另一个实例具有与{'Id'}相同的键值   已被跟踪。附加现有实体时,请确保   只能附加一个具有给定键值的实体实例。   考虑使用'DbContextOptionsBuilder.EnableSensitiveDataLogging'来   查看有冲突的键值。

为避免异常,我更新了代码:

Customer customer = context.Customers.Local.First(c => c.Id == id);
if (customer == null) {
    customer = new Customer () { Id = id };
    context.Customers.Attach(customer);
}
context.Customers.Remove(customer);
context.SaveChanges();