que tiene un requisito para cargar un objeto complejo llamado Nodo ... así que no es tan compleja ... se ve como sigue: -Cargando Eager Usando Fluido NHibernate/Nhibernate y Automapping
Un Nodo tiene una referencia a EntityType que tiene una uno a muchos con propiedad que a su vez tiene un uno a muchos con PorpertyListValue
public class Node
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual EntityType Etype
{
get;
set;
}
}
public class EntityType
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual IList<Property> Properties
{
get;
protected set;
}
public EntityType()
{
Properties = new List<Property>();
}
}
public class Property
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual EntityType EntityType
{
get;
set;
}
public virtual IList<PropertyListValue> ListValues
{
get;
protected set;
}
public virtual string DefaultValue
{
get;
set;
}
public Property()
{
ListValues = new List<PropertyListValue>();
}
}
public class PropertyListValue
{
public virtual int Id
{
get;
set;
}
public virtual Property Property
{
get;
set;
}
public virtual string Value
{
get;
set;
}
protected PropertyListValue()
{
}
}
Lo que intento hacer es cargar el objeto Node con todos los objetos secundarios, todo a la vez. Sin carga lenta. La razón es que tengo miles de objetos Node en la base de datos y tengo que enviarlos por cable usando el Servicio WCF. Encontré el problema de las clases SQL N + 1. Estoy usando Fluent Nhibernate con Automapping y NHibernate Profiler me sugirió que use FetchMode.Eager para cargar los objetos completos a la vez. Estoy utilizando el siguiente qyuery
Session.CreateCriteria(typeof (Node))
.SetFetchMode("Etype", FetchMode.Join)
.SetFetchMode("Etype.Properties", FetchMode.Join)
.SetFetchMode("Etype.Properties.ListValues", FetchMode.Join)
o el uso de NHibernate LINQ
Session.Linq<NodeType>()
.Expand("Etype")
.Expand("Etype.Properties")
.Expand("Etype.Properties.ListValues")
Cuando corro cualquiera de la consulta anterior, ambos generan una misma consulta individual con toda la externa izquierda se une, que es lo Necesito. Sin embargo, por alguna razón, el retorno IList de la consulta no se está cargando propiedad en los objetos. De hecho, el conteo de Nodos devueltos es igual al número de filas de la consulta, por lo que los objetos Nodos se repiten. Además, las propiedades dentro de cada Nodo se repiten, y también lo hacen los Valores de lista.
Así que me gustaría saber cómo modificar la consulta anterior para devolver todos los Nodos únicos con las propiedades y valores de lista dentro de ellos.
Gracias Nabeel
en Google me enteré de DistinctRootEntityResultTransformer pero que solo resuelve el problema para los objetos Root. Todavía estoy recibiendo duplicados en las colecciones secundarias. Cada objeto raíz en la lista devuelta tiene algún raro desorden producto cartesiano en el niño colecciones con varias instancias de la misma entidad. ¿Alguna idea? A la espera de Nabeel – nabeelfarid
Creo que he encontrado la solución, pero me gustaría saber si es el correcto. Las colecciones hijas (EType.Properties, Etype.Properties.ListValues) objeto raíz en el interior (nodo) son IList. Y he leído en la documentación que IList puede contener duplicados, así que si cambio IList a IColoque/ ICollection, la consulta no se carga instancias duplicadas dentro las colecciones hijas. Pero esta solución requiere mucha refactorización. Me gustaría saber si hay una manera de lograr lo mismo usando IList para niños colecciones? espera, Nabeel – nabeelfarid
Tengo el mismo problema (utilizando Fetchmode.Eager). Estoy bastante decepcionado con NHibernate por esto. Prefiero tener un error que datos incorrectos. – UpTheCreek