Linq DataContext仍然检索“已删除”对象

时间:2012-11-22 22:02:31

标签: vb.net linq linq-to-sql datacontext

我正在使用绑定到Linq Data“对象列表”的网格。

网格以“断开连接的方式”运行,这意味着当我编辑或抑制一行时,更改不会立即提交给数据库。在进行所有更改以调用DataContext.SubmitChanges方法后,单击一个单独的“保存”按钮。

问题是当我删除网格中的一行时,deleteonsubmit方法被很好地调用,但是当我刚刚重新绑定网格时,该行仍然在这里!

我需要像Datatables这样的行为,当数据表绑定到网格时,不会显示Deleted状态的行。这可能吗?

附录

没有很多代码,因为GridView使用它的自动行为(AutoGenerateColumns,AutoGenerateEditButton等)

以下是我用来删除对象的代码

<DataObjectMethod(DataObjectMethodType.Delete)> _
Public Sub Supprimer(ByVal code As Integer)
    Dim ctx = getDataContext()

    Dim leGerant = (From g In ctx.Gerant Where g.CODE = code).FirstOrDefault
    ctx.Gerant.DeleteOnSubmit(leGerant)

    End Sub

以下是我用来选择对象的代码

    <DataObjectMethod(DataObjectMethodType.Select)> _
    Public Function Selectionner()
        Dim ctx = getDataContext()

        Return From g In ctx.Gerant
    End Function

@magnus

你不明白我的问题。单击保存按钮时,我会调用SubmitChanges,这些更改生效。问题不在这里。

问题是当我删除网格中的一行时,deleteonsubmit方法被很好地调用,但是当我刚刚重新绑定网格时,该行仍然在这里!通常,删除的对象不应该在GridView中显示为一行,即使我还没有将更改提交到数据库。

1 个答案:

答案 0 :(得分:0)

DeleteOnSubmit没有“删除”该项目。它标志着它将在下次提交时删除。

您需要添加提交行,使其成为:

Dim ctx = getDataContext()
Dim leGerant = (From g In ctx.Gerant Where g.CODE = code).FirstOrDefault    
ctx.Gerant.DeleteOnSubmit(leGerant)
ctx.SubmitChanges()

编辑:假设您的两次通话中的ctx都是同一个实例,您可以尝试

<DataObjectMethod(DataObjectMethodType.Select)> _
Public Function Selectionner()
    Dim ctx = getDataContext()

    Dim deleted = ctx.ObjectStateManager
        .GetObjectStateEntries(System.Data.EntityState.Deleted).OfType<Gerant>();

    Return (From g In ctx.Gerant).Except(deleted);
End Function

这是未经测试的,所以我不确定它是否会起作用,但它似乎在编译。