2010-03-12 14 views
5

Es una buena idea crear una versión más ligera de una entidad en algunos casos solo por razones de rendimiento que apuntan a la misma tabla pero con menos columnas asignadas. Por ejemplo, si tengo una tabla de contactos que tiene 50 columnas y en algunas de las entidades relacionadas me interesaría la propiedad FirstName y LastName, es una buena idea crear una versión ligera de la tabla de contactos. P.ej.Uso de la versión Lite de Entity en nHibernate Relations?

public class ContactLite 
{ 
    public int Id {get; set;} 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 

} 

¿También es posible mapear múltiples clases en la misma mesa?

Respuesta

4

No es una buena idea. En cambio, siempre mapee la clase completa y cree otras más pequeñas en las que pueda proyectar usando Transformers.AliasToBean o LINQ.

Un ejemplo de esto último:

var lightContacts = (from contact in session.Linq<Contact>() 
        where contact.Country = "Argentina" 
        select new LightContact 
          { 
           Id = contact.Id 
           FirstName = contact.FirstName, 
           LastName = contact.LastName 
          }) 
        .ToList(); 

Esto sólo seleccionará aquellos tres campos de la base de datos, incluso cuando se filtra por una diferente.

Vale la pena señalar que, con LINQ, también podría usar un tipo anónimo para seleccionar cualquier proyección que desee sin crear tipos adicionales o asignaciones.

+0

Quiero usar principalmente para Relaciones. Si tengo una relación Many-2-One, no quiero que cargue 50 Columnas. – Amitabh

+0

Todavía el mismo caso. De forma predeterminada, los muchos se cargan como proxies utilizando la clave principal, y no se cargarán en absoluto si los excluye como se indica anteriormente. –

+0

Desafortunadamente estoy en nHibernate 1.2 con WCF y la carga lenta no es una opción conmigo. Entonces, todo está ansioso por traerse. – Amitabh

5

No asigne varias clases a la misma tabla. Intenté esto una vez y aunque funcionó para lo que estaba haciendo, estoy seguro de que me habría mordido más tarde. Es mejor usar proyecciones para poblar las clases "light".

1

Utilicé este enfoque para manejar una entidad sin un campo BLOB (solo para manejar relaciones, etc.).

tuve algunos problemas en relación con el polimorfismo implícito, lo que significa que tenía esta configuración:

ImageWithData clase pública: Imagen

La herencia hecha NHibernate cargar un ImageWithData en un segundo ida y vuelta cada vez que resolví una imagen directamente (no cuando está relacionado con BelongsTo o HasMany).

Hay una opción en NHibernate para deshabilitar este comportamiento, llamado polymorphism = "explicit" que especifica en su clase base (en mi caso, Image).

Si va a ser un mal diseño en su caso, no sé, todo depende de por qué necesita aclarar sus entidades.

Cuestiones relacionadas