C# 比较EF时间戳值

C# 比较EF时间戳值,c#,sql-server,entity-framework,ef-code-first,C#,Sql Server,Entity Framework,Ef Code First,我有一个EF Code First模型,其中有一个字节数组字段,标记有Timestamp属性。我需要比较两个时间戳,并确定哪一个较新。这看起来很简单,但我不确定SQL Server用什么样的值填充字节数组。我是否将它们转换为UInt64值,如下所示: BitConverter.ToInt64(item1.Timestamp, 0) < BitConverter.ToInt64(item2.TimeStamp, 0) BitConverter.ToInt64(item1.Timestamp

我有一个EF Code First模型,其中有一个字节数组字段,标记有Timestamp属性。我需要比较两个时间戳,并确定哪一个较新。这看起来很简单,但我不确定SQL Server用什么样的值填充字节数组。我是否将它们转换为UInt64值,如下所示:

BitConverter.ToInt64(item1.Timestamp, 0) < BitConverter.ToInt64(item2.TimeStamp, 0)
BitConverter.ToInt64(item1.Timestamp,0)

…还是我在这里遇到了一些微妙的陷阱?

Rowversion是SQL server中正确的类型。EF使用ByteArray映射到该数组。 或者更好地说。属性
[Timestamp]
或fluent API
属性(x).IsRowVersion
通过字节数组映射到SQL rowversion

因此,除非您需要实际的日期和时间,否则ROWVERSION是MS推荐的方法。

是,这些值是相对时间的指示,从某种意义上说,较小的值是在之前启动的。 但是,如果使用脏读取,则需要考虑大于比较的含义。

因为它是8字节,所以当它用完时,您不会在那里;-)
所以除了脏读之外,你还可以比较它们是的。


相关话题:

是的,你正走进一个陷阱。字节数组以big-endian格式存储行版本。但是,
BitConverter.ToInt64
希望在x86和x64 CPU体系结构上使用一点endian格式。我使用BitConverter运行了一个简单的测试,得到了初始行版本0xd207000000000000和下一行版本0xd307000000000000。SQL Server正在递增8字节序列的最后一个字节,但BitConverter认为第一个字节最重要。在您的订单比较偶尔停止工作之前,不会需要很多增量

解决方案是颠倒行版本字节的顺序,如下所示:

BitConverter.ToInt64(item1.Timestamp.Reverse().ToArray(), 0) <
BitConverter.ToInt64(item2.TimeStamp.Reverse().ToArray(), 0)
BitConverter.ToInt64(item1.Timestamp.Reverse().ToArray(),0)<
BitConverter.ToInt64(item2.TimeStamp.Reverse().ToArray(),0)

为什么要使用字节数组而不是日期时间?因为TimeStampAttribute就是这样工作的。“行版本类型(也称为序列号)是保证在数据库中唯一的二进制数。它不代表实际时间。行版本数据在视觉上没有意义。”()如果您需要代码可移植到big-endian机器,您可以调用
Reverse
conditional,以便在
BitConverter.IsLittleEndian
为false时忽略这些调用。