正確類型的代理我有在NHibernate的獲取NHibernate的
未初始化的代理問題的域模型
比方說,我有兩個平行的類層次結構:動物,狗,貓和AnimalOwner, DogOwner,CatOwner,Dog和Cat都繼承了Animal,DogOwner和CatOwner,均繼承了AnimalOwner。 AnimalOwner有一個叫做OwnedAnimal的動物類型的參考。
下面是類的實例:
public abstract class Animal
{
// some properties
}
public class Dog : Animal
{
// some more properties
}
public class Cat : Animal
{
// some more properties
}
public class AnimalOwner
{
public virtual Animal OwnedAnimal {get;set;}
// more properties...
}
public class DogOwner : AnimalOwner
{
// even more properties
}
public class CatOwner : AnimalOwner
{
// even more properties
}
的類有適當的nhibernate映射,所有屬性是持久的,一切可延遲加載是延遲加載。
應用程序業務邏輯只允許您在DogOwner中設置Dog,並在CatOwner中設置Cat。
的問題
我有這樣的代碼:
public void ProcessDogOwner(DogOwner owner)
{
Dog dog = (Dog)owner.OwnedAnimal;
....
}
這種方法可以由許多不同勢方法被調用,在大多數情況下,狗已經在內存中一切正常,但很少這條狗不在記憶中 - 在這種情況下,我得到了一個nhibernate「未初始化的代理」,但演員拋出了一個異常,因爲nhibernate生成了一個代理動物而不是狗。
我明白這是nhibernate的工作方式,但我需要知道該類型而不加載對象 - 或者更正確地說,我需要未初始化的代理是貓或狗的代理,而不是代理的動物。
約束
- 我不能改變域模型,該模型是由另一個部門交給我,我試圖讓他們改變模型和失敗。
- 實際模型比示例複雜得多,並且類之間有許多引用,使用預先加載或向查詢添加連接對於性能原因而言是不成問題的。
- 我完全控制了源代碼,hbm映射和數據庫模式,我可以根據需要更改它們(只要我不更改模型類之間的關係)。
- 我有很多像這個例子中的方法,我不想修改所有的方法。
感謝,
尼爾
謝謝,我不知道我可以使用這些技術在我的情況,但我會檢查出來。 – Nir 2009-04-16 12:52:04
添加到其他選項(`no-proxy`和`CastEntity`)。 – 2011-05-20 12:45:08
CastEntity是一個很好的嘗試,但是我遇到了一個問題:如果您有Parent和Child類,並且Parent類型的實例「p」實際上是一個Child(多態性),則該轉換將失敗編譯時,即使它會工作運行時間。另請注意,您的第一個「InhibernateProxy」在「h」上缺少資本。切換到「as」投沒有幫助,但「自我」技巧奏效。 – 2013-01-17 00:09:17