我正在尝试在对象中保存linq查询的数据,以便在数据更新到sql表之后与更新的字段进行比较。问题是,每次我访问原始linq查询对象时,我们都会看到更新,即使我正在使用ToArray,我认为它会立即执行查询,并且在引用该对象时不会再次执行。这是我的代码:
dim db as New DBDataContext
Dim oldJobPart = (From jp In db.JobParts
Where jp.JobNum = 10214
Select jp).ToArray
更新:
当在db对象中完成更新时,该对象与上述查询使用的对象相同,那么oldjobpart将反映新的更改。当我们创建一个新对象(db2)来更新数据库时,oldjobpart没有得到更新。
所以看起来如果我们使用相同的db对象来提交更新的更改(),即使我们没有触及oldjobpart对象并且我们使用toarray来创建oldjobpart,oldjobpart对象仍然会被更新。我想toArray不完全缓存数据并断开与原始数据库对象的连接?如果有人能证实这一点,我将不胜感激。
答案 0 :(得分:0)
是的,您的更新是正确的。
当您执行第一个查询时,它确实执行并将结果存储在数组中。
您遇到的问题是数组中的对象仍然附加到数据库上下文中 - 数组只是指向img
中缓存的对象。如果在代码中或DbContext
中的某个位置更新对象的属性,则还要更新数组所指向的对象。
如果你没有'想要创建多个上下文但希望数组中的对象与DbContext
不同,一个简单的方法就是使用AsNoTracking()
,这样对象就不会缓存在DbContext
中:
DbContext