2013-01-17 43 views
1

比方說,我做一個查詢對我的上下文檢索特定實體。如何檢測如果實體已經過時,需要重新加載

現在我想找到知道,如果在數據庫中的相應行(讓我們留在實體和SQL表之間的一對一映射簡單)自創建以來我的實體已經改變的最佳途徑。

我想過使用timestamp列,並執行一個簡單的查詢每個每個我想知道,如果實體是過時的,如:

var uptodate = (from e in context.mySet 
       where e.TimeStamp == entityTimeStamp 
       select e).Any(); 

通過索引時間戳列,我認爲這將是一個快速的方式去,但不幸的是我沒有發現任何確認周圍的互聯網...

回答

0

經過進一步的測試和使用時間戳和查詢知道它是否仍然是相同的(更確切地說,如果給定值仍然在表)看起來調查最好的方式去。

這種機制需要在時間戳列的索引,以確保代替(O(N))。

1

如果你正在尋找一種方式來做到這一點,而不必修改你的表,你可以使用CHECKSUM命令和添加一個額外的列到您的映射(大概爲視圖)。這樣您就不必擔心向數據庫添加新列。

像這樣的東西應該工作:

select *, 
    BINARY_CHECKSUM(*) as CheckSumValue 
from test WITH (NOLOCK); 

下面是一些示例fiddle

雖這麼說,有時是最好在你的表中的ModifiedDate場。如果是這種情況,那麼這肯定是檢查變化的最佳方式。

祝你好運。

+0

感謝您的回答最好性能(大約爲O(log(n)的,但我期待的最好方法 – Nock

+0

我不是暗示在不同的道具上運行服務器端,而是將它添加到視圖中,並使用你的ORM來處理該列。與添加額外的列的方式相同,而無需添加新的列,並擔心當實體改變。你可以使用類似的代碼到你上面,看看錶中的內容發生了變化。也許我誤解你的問題進行更新。祝你好運。 – sgeddes

+0

事實上,但我不介意添加和額外的列,我認爲TimeStamp應該比a更快校驗和計算。速度對我來說是最重要的。 – Nock

0

如果樂觀鎖是好的,怎麼樣在你的數據類添加[ConcurrencyCheck]屬性的領域。這會導致更新失敗,如果記錄已被修改。

屬性由System.ComponentModel.DataAnnotations

相關問題