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中删除对象?
您首先从上下文中找到该项目,然后将其删除.我使用了一个名为的属性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使用,而不是直接在应用程序中使用.
| 归档时间: |
|
| 查看次数: |
11475 次 |
| 最近记录: |