我在 nhibernate 中遇到了未初始化代理的问题
领域模型
假设我有两个平行的类层次结构:Animal、Dog、Cat 和 AnimalOwner、DogOwner、CatOwner,其中 Dog 和 Cat 都继承自 Animal,而 DogOwner 和 CatOwner 都继承自 AnimalOwner。AnimalOwner 有一个 Animal 类型的引用,称为 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
}
这些类具有适当的休眠映射,所有属性都是持久的,并且可以延迟加载的所有内容都是延迟加载的。
应用程序业务逻辑只允许您在 DogOwner 中设置 Dog,在 CatOwner 中设置 Cat。
问题
我有这样的代码:
public void ProcessDogOwner(DogOwner owner)
{
Dog dog = (Dog)owner.OwnedAnimal;
....
}
此方法可以由许多不同的方法调用,在大多数情况下,狗已经在内存中并且一切正常,但很少有狗不在内存中 - 在这种情况下,我得到一个休眠的“未初始化代理”,但演员抛出一个例外,因为 nhibernate 为 Animal 而不是 Dog 生成代理。
我知道这就是 nhibernate 的工作方式,但我需要知道类型而不加载对象 - 或者,更准确地说,我需要未初始化的代理作为 Cat 或 Dog 的代理,而不是 Animal 的代理。
约束
- 我无法更改领域模型,模型是由另一个部门交给我的,我试图让他们更改模型,但失败了。
- 实际模型比示例复杂得多,类之间有很多引用,出于性能原因,使用预加载或向查询添加连接是不可能的。
- 我可以完全控制源代码、hbm 映射和数据库模式,并且可以以任何我想要的方式更改它们(只要我不更改模型类之间的关系)。
- 我有很多方法,例如示例中的方法,我不想修改所有方法。
谢谢,
尼尔