Lazy-loaded Свойства NHibernate в Equals и GetHashCode

Как можно решить следующую проблему?

Мы используем свойства с отложенной загрузкой NHibernate , и всякий раз, когда мы вызываем Equals () или GetHashCode () , любые используемые свойства будут загружаться с отложенной загрузкой, потенциально вызывая каскад операций отложенной загрузки. В качестве альтернативы можно использовать нетерпеливую загрузку, но я думаю только в конкретных случаях, а не в качестве общего решения.

Типичный сценарий будет выглядеть следующим образом:

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

Реализация GetHashCode и Equals (object) была опущено для краткости.

Какие стратегии можно использовать для решения этой проблемы?

5
задан Peter Mortensen 23 October 2012 в 17:23
поделиться