【问题标题】:Linq DataContext still retrieve "Deleted" objectLinq DataContext 仍然检索“已删除”对象
【发布时间】:2012-11-22 22:02:30
【问题描述】:

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

网格以“断开连接的方式”运行,这意味着当我编辑或取消一行时,更改不会立即提交到数据库。在进行所有更改后单击一个单独的“保存”按钮以调用 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 中显示为一行,即使我尚未将更改提交到数据库。

【问题讨论】:

  • 这取决于您的代码...您没有向我们展示...
  • 发布一些代码,以便它可以清除您的查询。
  • 您必须致电ctx.SubmitChanges() 才能使更改生效。

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


【解决方案1】:

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

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

【讨论】:

  • 好的,你的意思是标记为删除的对象总是继续被检索,util我将更改提交到数据库?!
  • 如果是,我的解决方案是在内存中保留已删除对象的代码列表,并将它们从选择请求中排除。
  • @Kernel999 我的意思是,在调用SubmitChanges 之前,值仍在数据库中。因此,您拨打Return From g In ctx.Gerant 将继续检索它们。
  • @Kernel999 如果 ctx 是同一个实例,则添加了一种可能的解决方法。
  • ctx是同一个实例,据我所知,如果我用相同的DataContext多次执行“Return From g In ctx.Gerant”,它只会第一次访问数据库,其他时候它使用第一个请求返回的相同数据。
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多