如何检测实体是否过时并需要重新加载

时间:2013-01-17 23:24:26

标签: sql-server entity-framework-5

假设我对我的上下文进行查询以检索特定实体。

现在我想找到最好的方法来了解自我的实体创建以来数据库中的相应行(让实体和SQL表之间的1-1映射保持简单)是否已经改变。

我考虑过使用TimeStamp列并执行一个简单的查询,每个我想知道实体是否过时,如:

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

通过索引TimeStamp列,我认为这将是一个快速的方法,但不幸的是我没有在互联网上找到任何确认...

3 个答案:

答案 0 :(得分:1)

如果您正在寻找一种方法来执行此操作而无需修改表,则可以使用CHECKSUM命令并在映射中添加其他列(可能是视图)。这样您就不必担心向数据库添加新列了。

这样的事情应该有效:

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

以下是一些示例fiddle

话虽如此,有时候你的表中最好有一个ModifiedDate字段。如果是这种情况,那肯定是检查更改的最佳方式。

祝你好运。

答案 1 :(得分:0)

如果乐观锁定正常,那么如何将[ConcurrencyCheck]属性添加到数据类中的字段。如果记录已被修改,则会导致更新失败。

该属性来自System.ComponentModel.DataAnnotations

答案 2 :(得分:0)

使用TimeStamp和查询进行进一步的测试和调查以确定它是否仍然相同(更确切地说,如果给定值仍然在表中)似乎是最好的方法。

此类机制需要TimeStamp列上的索引以确保最佳性能(大致为O(Log(n)而不是(O(n))。