2011-04-14 48 views
11

Utilizo Entity Framework Code First y tengo una entidad definida con una propiedad StartTime, una propiedad EndTime y una propiedad Duration (junto con algunas otras). La propiedad Duration es un campo calculado y es la duración en minutos entre la hora de inicio y finalización. Mis declaraciones de propiedades se muestran a continuación:Almacenar campo calculado de solo lectura con Entity Framework Code First

public DateTime StartTime { get; set; } 
public DateTime EndTime { get; set; } 
public int Duration 
{ 
    get 
    { 
     return (int)this.EndTime.Subtract(this.StartTime).TotalMinutes; 
    } 
} 

me gustaría ejecutar este cálculo en el código, pero tienen el valor de duración persistió a la base de datos junto con los valores de tiempo de inicio y final (para que sea más fácil después de la línea cuando vengo a ejecutar informes contra estas cifras).

Mi pregunta es, ¿cómo puedo obtener esta propiedad de solo lectura para volver a hacer el mapa y guardarla en la base de datos usando el código primero?

Respuesta

19

Inspirado por la respuesta de Slauma, pude lograr lo que estaba buscando mediante el uso de un setter protegido. Esto mantuvo el valor en la base de datos, pero no permitió que el valor se modificara en otro lugar.

Mi propiedad ahora se ve así:

public int Duration 
{ 
    get 
    { 
     return (int)this.EndTime.Subtract(this.StartTime).TotalMinutes; 
    } 
    protected set {} 
} 
+0

Ah, buena idea para hacer que protegía! ¿También trataste de hacer el setter 'privado'? Sería interesante saber si EF asignará la propiedad a una columna DB. – Slauma

+1

¡Acabo de probar con un setter 'privado' y sorprendentemente continúa funcionando! – KevB

+3

EF actualizará la base de datos cada vez que se cargue esta entidad. Suponemos que el seguimiento de cambios de EF cree erróneamente que esta propiedad ha cambiado. Para nosotros, esto causó conflictos inesperados de concurrencia. –

2

El suministro de una incubadora vacía podría ser una posible solución (aunque entonces la propiedad no es de sólo lectura más, por supuesto):

public int Duration 
{ 
    get 
    { 
     return (int)this.EndTime.Subtract(this.StartTime).TotalMinutes; 
    } 
    set { } 
} 

Por lo que yo sé, las propiedades de sólo lectura no son asignables a una columna la base de datos.

Cuestiones relacionadas