LINQ to SQL版本属性的首选SQL Server列定义是什么?

4

我们在LINQ to SQL类的属性上使用ColumnAttributeIsVersion属性进行乐观并发检查。数据库中该列定义应是什么?

目前我们正在使用

version_number int NOT NULL IDENTITY (1, 1) 

我们需要身份验证吗?我们能否让LINQ to SQL为我们更新版本号?使用Identity的唯一问题是每行都有一个不同的数字。当更新行时,我们希望看到数字递增1。

3个回答

4
每次修改行时都应更新该行的“版本”-行的唯一ID绝对不符合此要求!(通常设置一次并永远不会更改)。
你需要查找的是SQL Server中的TIMESTAMPROWVERSION - 它曾经被称为TIMESTAMP,但由于它实际上只是一个8字节二进制“计数器”,与时间和/或日期无关(除了它随着时间单调递增),所以SQL Server团队从现在开始将其称为ROWVERSION
这是SQL Server内部更新的数据类型-您不能自己设置或插入该字段的值。它保证在每次更改行时都会更改,因此您可以使用它检测数据中是否有更改。
请参阅MSDN docs on rowversion或阅读ASP Alliance上的Understanding TIMESTAMP (ROWVERSION) in SQL Server文章。

@marc_s - 我想你的意思是单调递增。虽然“单调递增”也不算不准确。 - Mike Two
@Mike Two:你说得很对 :-) 我已经修正了我的帖子。谢谢。 - marc_s

1

在你的数据库表中应该使用一个时间戳数据类型。这将转换成实体中的 System.Data.Linq.Binary 类型。

使用时间戳数据类型,SQL Server 将自动为您创建并增加此值。


1

如果数据不会经常更改,您也可以使用真实的时间戳(我在金融应用程序中经常这样做,但我可以保证不同的时间戳),或者一个简单的计数列。


@TomTom - 我更喜欢一个简单计数列,但是当我将IsVersion属性设置为true时,我无法让LINQ to SQL更新它。 - Mike Two
同样的问题,不过 LINQ 没有提供这个功能。不过类本身可以在更改逻辑中处理它。虽然不是太好,但总比没有强。 - TomTom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接