¿Cómo se puede tratar el siguiente problema?Propiedades de NHibernate con carga lenta en Equals y GetHashCode
Estamos utilizando cargado ligeramente NHibernate propiedades y siempre que estamos llamando Equals()
o GetHashCode()
propiedades usadas, habrá perezoso-cargado, que puede causar una cascada de operaciones de carga perezosa. La carga impaciente podría usarse como alternativa, pero creo que solo en casos específicos y no como una solución general.
Un escenario típico sería el siguiente:
public class AbstractSaveableObject {
[Id(0, Name = "Id", UnsavedValue = null)]
[Generator(1, Class = "native")]
public virtual long? Id { get; set; }
}
[Class(NameType = typeof(ClassA))]
public class ClassA : AbstractSavableObject {
[Bag(0, Inverse = true, Cascade = "none")]
[Key(1, Column = "ClassA")]
[OneToMany(2, ClassType = typeof(ClassB))]
public virtual ICollection<ClassB> ClassBs { get; set; }
}
[Class(NameType = typeof(ClassB))]
public class ClassB : AbstractSavableObject {
[ManyToOne(Column = "ClassA")]
public virtual ClassA ClassA { get; set; }
[ManyToOne]
public virtual ClassC ClassC { get; set; }
[ManyToOne]
public virtual ClassD ClassD { get; set; }
public virtual bool Equals(ClassB other)
{
if (ReferenceEquals(null, other))
{
return false;
}
if (ReferenceEquals(this, other))
{
return true;
}
return Equals(other.ClassC, ClassC) && Equals(other.ClassD, ClassD);
}
}
Implementación de GetHashCode
y Equals(object)
se han omitido por razones de brevedad.
¿Qué estrategias se pueden utilizar para abordar este problema?
¿No tiene ninguna clave principal en sus entidades? – asgerhallas
Sí, lo hago, los he omitido, en realidad todas las clases persistentes se derivan de una clase base abstracta que contiene una clave primaria sustituta. Pero –