如何在c#中使用DbContext删除对象?

时间:2015-05-03 19:18:56

标签: c# .net winforms linq entity-framework

我有这个删除方法:

private void btnDeleteOrderLine_Click(object sender, EventArgs e)
{
    OrderLine orderLine = (OrderLine)dgvOrderLine.SelectedRows[0].DataBoundItem;
    db.OrderLines.Remove(orderLine);
    db.SaveChanges();
    refreshGrid();
}

当我点击删除按钮时,我收到此错误:

  

无法删除该对象,因为在该对象中找不到该对象   ObjectStateManager

我发现这是因为有两个Context类的实例。所以,我试过这个:

private void btnDeleteOrderLine_Click(object sender, EventArgs e)
{
    OrderLine orderLine = (OrderLine)dgvOrderLine.SelectedRows[0].DataBoundItem;
    db.OrderLines.Attach(orderLine);  // added this part
    db.OrderLines.Remove(orderLine);
    db.SaveChanges();
    refreshGrid();
}

然后这给了我以下错误:

  

实体对象不能被多个实例引用   IEntityChangeTracker

如何修复此问题并从Context DbSet中删除对象?

2 个答案:

答案 0 :(得分:7)

您首先从上下文中找到该项目,然后将其删除。我使用了一个名为Id的属性。事实并非如此。您已在那里设置了相应的密钥属性。

var selectedOrderLine = (OrderLine)dgvOrderLine.SelectedRows[0].DataBoundItem;

// Here using the context class we try to find if there is the 
// selected item at all 
var orderLine = db.OrderLines.SingleOrDefault(item=>item.Id == selectedOrderLine.Id);

if(orderLine!=null)
{
    // The items exists. So we remove it and calling 
    // the db.SaveChanges this will be removed from the database.
    db.OrderLines.Remove(orderLine);
    db.SaveChanges();
    refreshGrid();
}

现在让我们更深入一点,以便我们理解以下错误消息:

  

无法删除该对象,因为在该对象中找不到该对象   ObjectStateManager。

什么是ObjectStateManager课程?收到MSDN

  

ObjectStateManager 跟踪查询结果,并提供合并逻辑   多个重叠的查询结果。它还执行内存中更改   跟踪用户何时插入,删除或修改对象,以及   提供更新的更改集。此更改集由。使用   改变处理器以保持修改。

除上述内容外:

  

此类通常由ObjectContext使用,不直接   应用

答案 1 :(得分:1)

尝试使用删除而不是删除并使用

将其包装
using (YourContext db = new YourContext())
 {
            db.OrderLines.Attach(orderLine);  // added this part
            db.OrderLines.DeleteObject(orderLine);
            db.SaveChanges();   
  }