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()
}