2010-04-05 92 views
5

我正在使用EF4並通過Entity設計表面創建類,然後從它們生成數據庫。我想爲某些類添加一個屬性來顯示它們上次更新的時間戳。如何添加RowVersion屬性到EF4類

我已經爲它們添加了一個版本屬性,但我不知道要與它們關聯哪個.Net數據類型,以便它們在數據庫中生成時變爲時間戳或RowVersion。

任何想法?

+0

當你走另一條路(DB - >模型)的類型是'字節[]'(代碼)和「二進制」(在EDMX中)。 – 2010-04-07 20:51:47

+0

@Craig - 當你從模型中重新生成數據庫時,時間戳列會變成二進制列,並且你失去了我正在尋找的行爲。 – 2010-04-08 10:49:54

+0

要明確一點,SQL Server'TIMESTAMP'根本不是時候。這是你想要的,還是你想要一個時間?我假設你想要一個'TIMESTAMP',這確實是二進制的。 – 2010-04-08 12:07:10

回答

4

您使用byte[]類型rowversion /時間戳

使用例:http://www.ienablemuch.com/2011/07/using-checkbox-list-on-aspnet-mvc-with_16.html

如果你是在設計,只需鍵入byte[]System.Byte[],我覺得EF設計字段類型下拉選擇可鍵入。

鑑於此DDL

create table Movie 
(
MovieId int identity(1,1) not null primary key, 
MovieName varchar(100) not null unique, 
MovieDescription varchar(100) not null unique, 
YearReleased int not null, 
Version rowversion -- rowversion and timestamp are alias of each other 
); 

這是類映射:

public class Movie 
{ 
    [Key] 
    public virtual int MovieId { get; set; } 
      
    [   Required, Display(Name="Title") 
    ]   public virtual string MovieName { get; set; } 
      
    [   Required, Display(Name="Description") 
    ]   public virtual string MovieDescription { get; set; } 
      
    [   Required, Display(Name="Year Released"), Range(1900,9999) 
    ]   public virtual int? YearReleased { get; set; } 
      
    [Timestamp] 
    // byte[] is the rowversion/timestamp .NET type 
    public virtual byte[] Version { get; set; } 
  
      
    public virtual IList<Genre> Genres { get; set; }              
} 
+2

呃哦,我正在回答去年的問題:D – 2011-08-05 00:27:53

3

據我所知,rowversion是一個相對的二進制值,而不是實際的時間值。對於發生的每個插入和更新都會增加。這允許您比較值以確定哪個記錄更新。既然它是相對的,給定一個單一的rowversion值,你什麼都不會知道,但是如果給出兩個rowversion值,你就會知道哪個更老,哪個更新,但不知道多少。

我不知道要與它們關聯哪個.Net數據類型,以便它們在生成時變爲數據庫中的Timestamp或RowVersion。

我不確定,但最有可能沒有一個數據類型,可以讓你從模型到數據庫時的rowversion。您必須自己更改數據庫字段類型,或將該字段添加到數據庫並將記錄提交給您的模型。您也可以生成DDL,然後在使用它創建數據庫之前對其進行修改。

還有另一種方法,您可以通過派生它的類來擴展EF過程的功能。你可以自己選擇它,但我不太熟悉如何做到這一點。