即使从数据库中重新加载,我当前的上下文仍保留旧值

时间:2019-04-01 21:47:09

标签: vb.net entity-framework-6

我正在使用vb.net 2017,Entity Framework 6和sql server 2018R2。 我有一个表TB1(id,name,value1) 我得到了数据:

myquery=(From t in context.tb1s select t).tolist

现在,myquery的记录中包含以下值:name = Name1,value1 = 5

另一个在另一台PC上运行相同程序的用户,对数据库value1 = 10上的该记录进行了更改。他将更改保存在数据库中。

在我的表单上,我有一个“刷新”按钮,它会再次执行我的第一个查询:

myquery=(From t in context.tb1s select t).tolist

但是在该记录上,value1仍为5,并且未获取更新后的值。 当其他用户创建新记录或删除现有记录时,我没有问题。当我按下“刷新”按钮时,所有这些更改都会反映出来。但是,当记录更新时,我总是具有旧值。

我该如何解决此问题不处理上下文

谢谢!

编辑 我发现了2种通用方法可以解决此问题而无需处理上下文(使用新值从数据库刷新实体及其子级)

方法1

For Each en As tb1 In tb1collection
    context.Entry(en).Reload()
    For Each chld In en.mychilds
       context.Entry(chld).Reload()
     Next
Next

方法2

For Each en As tb1 In tb1collection
 For i= en.mychilds.count-1 to 0 step -1
  context.Entry(en.mychilds(i)).State = EntityState.Detached
 Next
 context.Entry(en).State = EntityState.Detached
Next
context.tb1s.Include("mychilds").Load

问题在于,当重新整理实体的集合非常大时,这两种方法都很慢。 我该怎么办?

1 个答案:

答案 0 :(得分:0)

这有效:

Dim contextobj = (CType(context, IObjectContextAdapter)).ObjectContext
contextobj.Refresh(RefreshMode.StoreWins, context.tb1s.Local)
contextobj.Refresh(RefreshMode.StoreWins, context.mychilds.Local)