如何處理以下問題?Equals和GetHashCode中的惰性加載的NHibernate屬性
我們使用懶加載NHibernate特性,每當我們調用Equals()
或GetHashCode()
使用任何屬性,將延遲加載,可能導致延遲加載操作的級聯。急切加載可以用作替代,但我認爲只有在特定情況下,而不是作爲一般解決方案。
一個典型的情況是這樣的:
實施GetHashCode
和
Equals(object)
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);
}
}
已爲簡潔起見省略。
有什麼策略可以用來解決這個問題?
您的實體上沒有任何主鍵嗎? – asgerhallas 2011-02-15 12:05:35
是的,我做了,我省略了它們,實際上所有持久化類都來自包含代理主鍵的抽象基類。 – 2011-02-15 12:24:29