visual tutorial studio para mvc framework first español descargar code entity-framework ef-code-first entity-framework-6 entity-framework-6.1 ef-migrations

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 objeto Bar . 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).