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

Jah*_*nov 4 .net c# linq entity-framework winforms

我有这个删除方法:

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

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

无法删除该对象,因为在该对象中找不到该对象 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();
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

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

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

Chr*_*tos 9

您首先从上下文中找到该项目,然后将其删除.我使用了一个名为的属性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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

ObjectStateManager班级是什么?根据MSDN:

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

除上述内容外:

此类通常由ObjectContext使用,而不是直接在应用程序中使用.