2010-04-05 12 views
5

Sto utilizzando EF4 e sto creando classi attraverso la superficie di progettazione di Entity, generando quindi il database da esse. Voglio aggiungere un attributo ad alcune classi per mostrare il timestamp in cui sono stati aggiornati l'ultima volta.Come aggiungere un attributo RowVersion a una classe EF4

Ho aggiunto un attributo Version a loro, ma non so quale tipo di dati .Net associare con essi in modo che diventino Timestamp o RowVersion nel database quando viene generato.

Qualche idea?

+0

Quando si va nella direzione opposta (DB -> modello) il tipo è 'byte []' (in codice) e "Binary" (in EDMX). –

+0

@Craig: quando rigenererai il DB dal modello, la colonna timestamp diventa una colonna binaria e perdi il comportamento che sto cercando. –

+0

Per essere chiari, un 'TIMESTAMP' di SQL Server non è affatto un orario. E 'questo quello che vuoi o vuoi un momento? Presumo che tu volessi un 'TIMESTAMP', che è davvero binario. –

risposta

4

si utilizza byte[] tipo per rowversion/timestamp

uso Esempio: http://www.ienablemuch.com/2011/07/using-checkbox-list-on-aspnet-mvc-with_16.html

Se si è nella finestra di progettazione, basta digitare in byte[] o System.Byte[], penso che i tipi di campo di selezione a discesa EF progettista può essere digitato in.

Dato questo 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 
); 

Questa è la mappatura di classe:

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

uh oh .., sto rispondendo a una domanda dell'anno scorso: D –

3

Per quanto ne so, rowversion è un valore binario relativo, non un valore temporale effettivo. Aumenta per ogni inserto e aggiornamento che si verifica. Ciò consente di confrontare i valori per determinare quale record è più recente. Dato che è relativo, dato un singolo valore di rowversion, non saprai nulla, ma dati due valori di rowversion, saprai quale è più vecchio e quale è più recente, ma non di quanto.

Non so quale tipo di dati .Net associare con essi in modo che diventino Timestamp o RowVersion nel database quando viene generato.

Non sono sicuro, ma molto probabilmente non esiste un tipo di dati che fornirà rowversion quando si passa da un modello all'altro. Dovrai modificare tu stesso il tipo di campo del database, o aggiungere il campo al DB e portare il record sul tuo modello. È anche possibile generare il DDL e quindi modificarlo prima di creare il DB con esso.

C'è anche un altro metodo in cui è possibile estendere la funzionalità del processo EF derivando dalle sue classi. Puoi quindi sceglierlo da solo, ma non ho molta familiarità con il modo di farlo.

Problemi correlati