2010-03-09 17 views
4

我們使用ColumnAttribute上的IsVersion屬性對LINQ to SQL類中的屬性進行樂觀併發檢查。列定義應該在數據庫中應該是什麼?用於LINQ to SQL Version屬性的首選sql server列定義是什麼?

目前我們使用的

version_number int NOT NULL IDENTITY (1, 1) 

我們是否需要身份?我們可以通過LINQ to SQL爲我們更新版本號嗎?身份唯一的問題是每行都有不同的數字。當行更新時,我們希望看到數字增加1。

回答

4

行的「版本」應該在每次修改行時更新 - 行的唯一ID肯定是而不是有資格申請! (這通常設置一次,永不改變)。

什麼你要找的是SQL Server中的TIMESTAMPROWVERSION - 它曾經被稱爲TIMESTAMP,但因爲它是真的只是一個8字節的二進制「計數器」,並已無關,與時間和/或日期(除了隨着時間的推移單調增加的事實),SQL Server團隊將從現在開始稱其爲ROWVERSION

這是由SQL Server內部更新的數據類型 - 您無法自行設置或將值插入到此類字段中。每次行更改時都會保證更改,以便您可以使用它來檢測數據中的某些內容。

查看MSDN docs on rowversion或閱讀ASP聯盟的文章Understanding TIMESTAMP (ROWVERSION) in SQL Server

+0

@marc_s - 我想你的意思是單調遞增。雖然單調並不準確。 – 2010-03-09 19:36:26

+0

@Mike Two:你絕對是對的:-)修復了我的帖子。謝謝。 – 2010-03-09 19:46:20

1

您應該在數據庫表中使用Timestamp數據類型。這將轉化爲實體中的System.Data.Linq.Binary類型。

使用Timestamp數據類型,SQL Server會自動爲您創建並增加此值。

1

另外,如果數據不會經常更改(我在金融應用程序中做了很多工作,但我可以保證不同的時間戳)或簡單的計數列,您可以使用實時時間戳。

+0

@TomTom - 我更喜歡一個簡單的計數列,但當我將IsVersion屬性設置爲true時,我無法獲取LINQ to SQL來更新它。 – 2010-03-09 20:09:10

+0

同樣在這裏,沒有 - LINQ沒有這方面的條款。但是,該類可以在更改邏輯中處理它自己。不太好......但好....比沒有好。 – TomTom 2010-03-09 20:35:34