entity-framework - tutorial - entity framework visual studio 2017
Perseverar y recuperar propiedad de entidad serializada con el código de Entity Framework 6.1 primero (2)
Ejemplo: digamos que tengo estas tres clases. Foo
es una entidad adecuada de Entity Framework con un DbSet, mientras que yo quiero que mi EF DbContext no tenga conocimiento de Bar
y Baz
porque he marcado la propiedad Foo''s Bar con mi atributo compuesto SerializedColumn
. Al aplicar ese atributo, quiero que EF serialice la instancia de Bar con sus Bazes en un solo campo de cadena, y deserialice de forma transparente Bar a un objeto Bar cuando un EF se materializa en un Foo.
public class Foo
{
public Guid Id { get; set; }
[SerializedColumn]
public Bar Bar { get; set; }
// ..
}
public class Bar
{
public string Name { get; set; }
public Baz[] Baz { get; set; }
// ..
}
public class Baz
{
public string Name { get; set; }
// ..
}
Así que las columnas de la mesa de Foo se verían así:
[Id] [uniqueidentifier] NOT NULL
[Bar] [nvarchar](max) NULL
Y cuando consulto un Foo
me devuelven uno con la propiedad del Bar
ya deserializada. Cuando inserto o actualizo una propiedad de Foo
the Bar
, serializa EF sin que tenga que pensar en ello. Lo único que tengo que hacer es agregar el atributo [SerializeColumn]
a las propiedades.
Metas:
- No necesariamente estoy buscando una solución completa (aunque la aceptaría), sino una guía sobre dónde ingresar a la cartera de proyectos de EF y cómo hacerlo. ¿Qué clases de EF, configuraciones, convenciones, etc. debo tener en cuenta?
- Quiero que las Migraciones se generen como uno esperaría. Es decir, no me gustaría que mi propiedad de
Bar
convierta en un campo "Bar_Id" que apunta a una tabla de "Barra". En su lugar, quiero un campo "Barra"nvarchar(max)
que contendrá la versión serializada de un objetoBar
. Si esto simplemente no es posible, dígalo en su respuesta.
Notas:
- La idea surgió luego de ver el video Building Applications with Entity Framework 6 de Rowan Miller.
-
ComplexType
no satisface mis necesidades. Necesito una serialización profunda y no es necesario que pueda filtrar ni ordenar ninguna propiedad de lo que se serializó. - Planeo serializar con la biblioteca JSON de Newtonsoft, pero realmente no importa cómo ocurre la serialización.
La única solución es esta,
public class Foo
{
public Guid Id { get; set; }
// Not Mapped attribute will make EF
// ignore this property completely
[NotMapped]
public Bar BarObject {
get;
set;
}
public string Bar{
get{
return JsonConvert.Serialize(BarObject);
}
set{
BarObject = JsonConvert.Deserialize<BarObject>(value);
}
}
}
Actualizado según la sugerencia de @zds
No hay forma de hacerlo sin modificar EF. Con EF 6 creo que varias personas lo hicieron con un campo de respaldo de texto y algunas limitaciones (los niños Bar y Bar no tienen acceso a la propiedad EF persistente o usted necesita otro trabajo después de la deserialización).