2012-02-26 4 views
6

Una de las clases de mi entidad sería posible almacenar en un servidor SQL la base de datos como BIGINT. Mi pregunta es: ¿cómo obtengo un contexto de Entity Framework para saber cómo almacenar y recuperar instancias de mi clase de entidad?Cómo decirle al marco de la entidad cómo guardar instancias de un tipo personalizado (que se puede almacenar como un escalar)

Más detalles. Estoy usando Noda Time, que puede representar un rango (mucho) más amplio de fechas que SQL o .NET datetime (Y es un postre topping). Mi clase de entidad, Happening, es un contenedor de la clase instantánea de NodaTime. Puedo establecer un Happening de un largo, y obtener un largo desde pasando con métodos como .SetFromLong (long instant) y .ToLong().

Actualmente tengo mi modelo funcionando, guardando las clases que contienen propiedades del tipo punto Fecha de dot net. Si en cambio quiero usar las propiedades de mi tipo personalizado "Happening", ¿cómo le digo a Entity Framework cómo guardarlas?

Si estoy leyendo este artículo sobre Modelado y mapeo estoy en el derecho o me falta algo más simple?

http://msdn.microsoft.com/en-us/library/bb896343.aspx

estoy usando Entity Framework 4.

+0

duplicado: http://stackoverflow.com/questions/5820915/entity-framework-custom-data-type-mapping –

Respuesta

6

lo que recomiendo hacer es la adición de 2 propiedades en su entidad un NodaTime y una larga, y excluir a su propiedad NodaTime usando [NotMapped] en su EF modelo, luego en su getter/setter actualizar el largo.

es decir

public class MyEntity{ 
    public long TimeAsLong{get;set;} 
    [NotMapped] 
    public Happening { 
     get{ 
     return new Happening().SetFromLong(TimeAsLong); 
     } 
     set { 
     TimeAsLong = value.ToLong(); 
     } 
    } 
} 

El efecto de esto será que el tiempo se almacena en la base de datos, pero se puede acceder a él a través de la clase NodaTime

+1

Eso funcionó, gracias. No necesito TimeAsLong, excepto para acomodar EF, ¿eso le viene muy bien y (en su experiencia) trata de nombrar a esos miembros distintivamente, TimeAsLongForEF, algo así? –

+0

Todo se trata de almacenamiento vs presentación, a veces es mejor/más eficiente para almacenar algo de forma diferente a cómo desea usarlo, este es un ejemplo. En realidad no hay montones de lugares que he encontrado donde tengo que hacer esto pero sucede en ocasiones, otro ejemplo que he encontrado es almacenar un solo objeto en la base de datos requiere convertirlo a una cadena en su modelo de escritura (EF no distingue entre varchar [1] y varchar [2] son ​​ambas cadenas). Personalmente, no etiquetaría el campo como EF, pero eso es solo una preferencia. –

+0

También tenga en cuenta que a EF no le importa realmente si la propiedad es pública o no (si usa Code First). Aunque todavía necesita alguna forma de mapearlo, incluso si es privado. Lo que hicimos, pusimos la clase de configuración EF en la clase de entidad para que también pueda acceder a los campos privados y hacer la asignación. El inconveniente es que tiene una clase de mapeo en su entidad que puede o no tener un problema. –

Cuestiones relacionadas