2010-04-05 16 views
5

Estoy usando EF4 y creando clases a través de la superficie de diseño de la Entidad y luego generando la base de datos a partir de ellos. Quiero agregar un atributo a algunas de las clases para mostrar la fecha y hora en que fueron actualizadas por última vez.Cómo agrego un atributo RowVersion a una clase EF4

He añadido un atributo de versión para ellos, pero no sé qué tipo de datos .Net asociar con ellos para que se conviertan en Timestamp o RowVersion en la base de datos cuando se genera.

¿Alguna idea?

+0

Cuando vas a la inversa (DB -> modelo) del tipo es 'byte [] '(en código) y "Binario" (en EDMX). –

+0

@Craig - cuando luego regenera la base de datos del modelo, la columna de la marca de tiempo se convierte en una columna binaria y usted pierde el comportamiento que estoy buscando. –

+0

Para ser claros, un SQL Server 'TIMESTAMP' no es un tiempo en absoluto. ¿Es eso lo que quieres, o quieres un tiempo? Presumía que querías un 'TIMESTAMP', que de hecho es binario. –

Respuesta

4

Se utilizan byte[] tipo para rowversion/marca de tiempo

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

Si se encuentra en el diseñador, sólo tiene que escribir byte[] o System.Byte[], creo que el tipo de campo de selección desplegable de diseñador de EF puede ser mecanografiado en.

Dada esta 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 
); 

Este es el mapeo de clases:

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 .., estoy respondiendo una pregunta del año pasado: D –

3

Por lo que sé, rowversion es un valor binario relativo, no un valor de tiempo real. Se incrementa para cada inserción y actualización que ocurra. Esto le permite comparar valores para determinar qué registro es más nuevo. Dado que es relativo, dado un valor de conversión de fila única, no sabrá nada, pero dados dos valores de conversión de filas, sabrá cuál es más antiguo y cuál es más nuevo, pero no por cuánto.

No sé qué tipo de datos .Net asociar con ellos para que se conviertan en Timestamp o RowVersion en la base de datos cuando se genera.

No estoy seguro, pero lo más probable es que no haya un tipo de datos que le proporcione una versión de la fila al pasar del modelo a la base de datos. Tendrá que cambiar el tipo de campo de la base de datos usted mismo, o agregar el campo al DB y llevar el registro a su modelo. También podría generar el DDL y luego modificarlo antes de crear el DB con él.

También hay otro método donde puede ampliar la funcionalidad del proceso EF derivando de sus clases. A continuación, puede elegirlo usted mismo, pero no estoy muy familiarizado con la forma de hacerlo.

Cuestiones relacionadas