【问题标题】:How can I delete object with DbContext in c#?如何在 C# 中使用 DbContext 删除对象?
【发布时间】:2015-05-03 19:18:56
【问题描述】:

我有这个删除方法:

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 中删除一个对象?

【问题讨论】:

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


    【解决方案1】:

    您必须首先从上下文中找到该项目,然后将其删除。我使用了一个名为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 类是什么?编码为MSDN

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

    除上述之外:

    这个类通常由 ObjectContext 使用,不直接在 应用程序。

    【讨论】:

    • 喜欢这个 :) 谢谢先生!
    • 我很乐意看到这个更新以包含 db 和 item 的定义。
    【解决方案2】:

    尝试使用 delete 而不是 remove 并使用

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

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 2013-05-12
      • 1970-01-01
      • 2022-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多