我有这个删除方法:

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
如何修复此问题并从上下文数据库集中删除对象?

最佳答案

首先从上下文中找到该项,然后将其删除。我使用了一个名为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使用,而不是直接在
应用。

关于c# - 如何在C#中使用DbContext删除对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30018282/

10-13 07:31
查看更多