entity framework - ¿Cómo se puede usar NodaTime con el código EF primero?
entity-framework (3)
Realmente quiero poder usar NodaTime en mis proyectos de base de datos de Entity Framework Code First, pero no he encontrado una forma "limpia" de hacerlo. Lo que realmente quiero hacer es esto:
public class Photoshoot
{
public Guid PhotoshootId{get; set;}
public LocalDate ShootDate{get; set;} //ef ignores this property
}
¿Existe algún enfoque recomendado o recomendado para usar NodaTime con el código EF primero?
EF Core 2.1 tiene una nueva característica de conversiones de valor , que es exactamente para este escenario.
//OnModelCreating
builder.Entity<MyEntity>
.Property(e => e.SomeInstant)
.HasConversion(v => v.ToDateTimeOffset(), v => Instant.FromDateTimeOffset(v));
.HasConversion
tiene otras sobrecargas para hacer que esta lógica sea reutilizable, por ejemplo, puede definir su propio ValueConverter
.
Hasta que la persistencia del tipo primitivo personalizado se admita de forma nativa en Entity Framework, una solución común es usar las propiedades de los amigos .
Para cada primitiva personalizada dentro de su modelo de dominio, creará una primitiva asignada asociada para mantener el valor en un formato compatible con Entity Framework. Las propiedades primitivas personalizadas se calculan a partir del valor de su propiedad de amigo correspondiente.
Por ejemplo:
public class Photoshoot
{
// mapped
public Guid PhotoshootId{get; set;}
// mapped buddy property to ShootDate
public DateTime ShootDateValue { get; set; }
// non-mapped domain properties
public LocalDate ShootDate
{
get { // calculate from buddy property }
set { // set the buddy property }
}
}
Usamos NodaTime en nuestro código. Primero, los POCO usan exactamente este enfoque.
Obviamente, esto lo deja con un solo tipo que actúa como un código primero POCO y un tipo de dominio. Esto se puede mejorar a costa de la complejidad al separar las diferentes responsabilidades en dos tipos y mapearlas entre ellas. Una alternativa a medio camino es insertar las propiedades del dominio en un subtipo y hacer que todas las propiedades de amigos asignadas estén protegidas. Con una cierta cantidad de Entity Framework se puede hacer que se asigne a las propiedades protegidas.
Esta publicación de blog más bien espléndida evalúa el soporte de Entity Framework para varias construcciones de modelado de dominios que incluyen primitivas encapsuladas. Aquí es donde inicialmente encontré el concepto de propiedades de amigos al configurar nuestros POCO: http://lostechies.com/jimmybogard/2014/04/29/domain-modeling-with-entity-framework-scorecard/
Otra publicación en el blog de esa serie analiza la asignación a propiedades protegidas: http://lostechies.com/jimmybogard/2014/05/09/missing-ef-feature-workarounds-encapsulated-collections/
No hay una forma "limpia" de la que tenga conocimiento porque EF, en el momento de esta publicación, no tiene un mecanismo para la conversión de tipos simple como se ve en NHibernate (IUserType). Una limitación real en EF como ORM que me obliga a cambiar mi dominio para que se adapte a mi ORM.