我有这个删除方法:
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中删除对象?
答案 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();
}