type per lock herencia framework for first code vb.net group-by ef-code-first table-per-hierarchy discriminator

vb.net - per - Tabla de Entity Framework 4.2 por grupo de jerarquía por discriminator



entity framework rowversion (2)

Una solución sería modelar un poco más y tener una nueva entidad ProductType tenga un Name propiedad. Entonces tendría una relación simple 1-N entre Product y ProductType Product . No he utilizado EntityFramework , pero con NHibernate podría hacer que el marco siempre se una a esa tabla en las consultas, para que no devuelva un proxy para ProductType para cada Product , lo que podría dañar el rendimiento.

Como complemento, en el futuro ProductType podría desarrollar otras propiedades interesantes (como los valores que son comunes para todos los Product de ese ProductType ), por lo que agrega flexibilidad a su solución, aunque tiene el costo inmediato de agregar otra tabla a tu base de datos

Estoy trabajando en un proyecto utilizando un primer modelo de código EF 4.2. Este modelo contiene una estructura de herencia TPH para productos. Necesito agrupar los resultados polimórficos de este modelo de herencia en el discriminador y me encuentro con algunos problemas.

El marco de la entidad no expone al discriminador para completar esta agrupación. Mi primera pregunta es ¿puedo obtener acceso directo a este discriminador? Mi lectura y experiencia me dicen que no, así que se me ocurrió esta solución que funciona de alguna manera. No está funcionando bien y no estoy contento con la forma en que tendrá que mantenerse.

Mis clases se ven algo así (simplificado):

Public MustInherit Class Product <key()> Public Property ProductID as integer <StringLength(50, ErrorMessage:="Max 50 characters")> <Required(ErrorMessage:="Product name is required")> Public Property Name as String <TimeStamp()> Public Property Time_Stamp as DateTime = DateTime.Now() End Class Public Class Desktop Inherits Product <StringLength(50, ErrorMessage:="Max 50 characters")> <Required(ErrorMessage:="Processor is required")> Public Property Processor as String End Class Public Class Monitor Inherits Product <Required(ErrorMessage:="Monitor size is required")> Public Property Size_Inches as Integer End Class

Creé un método de extensión que toma un producto y devuelve su nombre de tipo de línea como una cadena.

<Extension()> Public Function ProductType(ByVal inProduct as Product) as String ProductType = inProduct.GetType().BaseType.Name End Function

Con eso, construí esta estructura para agrupar los resultados del producto por tipo para poder analizarlos:

Dim tmpProducts = db.Products.ToList() Dim GrpProducts = tmpProducts.GroupBy(Function(prod) prod.ProductType) _ .Select(Function(s) New With {.ProductType = S.Key, .Products = S })

Ahora puedo recorrer la lista para obtener el comportamiento que deseo, pero el rendimiento no es el ideal y me preocupa que sea inaceptable a medida que crezca la cantidad de productos.

For Each ProductGroup in GrpProducts Dim TypeName as String = ProductGroup.ProductType Dim TypeProducts = ProductGroup.Products Next

Además, esto puede darme acceso fácil a las propiedades compartidas (Nombre), pero ahora no tengo muchas opciones para convertirlas en su tipo real, tal vez un caso selectivo alrededor de TypeName. . .

Cualquier recomendación es apreciada, también perdone cualquier error de código anterior, reescribí los ejemplos de memoria ya que no tengo acceso al proyecto en este momento.


Seguir la consulta de Linq debería ser una forma de resolver el grupo por discriminador

from a in db.Records group a.ID by new { Name= a is Audio ? "Audio" : a is Video ? "Video" : a is Picture ? "Picture" : a is Document ? "Document" : "File" } into g select new { Name = g.Key.Name, Total = g.Count() }