正确类型的代理我有在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