我在nhibernate中遇到了未初始化的代理问题
领域模型
假设我有两个并行的类层次结构:Animal,Dog,Cat和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
}
Run Code Online (Sandbox Code Playgroud)
这些类具有正确的nhibernate映射,所有属性都是持久的,并且可以延迟加载的所有内容都是延迟加载的.
应用程序业务逻辑只允许您在DogOwner中设置Dog,在CatOwner中设置Cat.
问题
我有这样的代码:
public void ProcessDogOwner(DogOwner owner)
{
Dog …Run Code Online (Sandbox Code Playgroud) 我有一个关于 NHibernate 代理的问题。我的日志文件中有很多日志,例如:将代理缩小到 - 此操作中断==网上还有一些其他问题和不同的答案:
Stackoverflow NHibernate 缩小代理警告 这是否是一件大事取决于您愿意接受的风险程度。由于代码和数据库之间始终存在脱节,因此您无法始终确保转换能够正常工作。这将导致可能难以诊断的错误,并且如果不更改数据库或代码就可能无法解决。
hibernate 的另一篇文章:
缩小问题范围 不要担心他的警告,只需将以下内容放入您的日志文件中,您就不会再看到它了......
为什么会发生这种情况?假设您有一个与地址具有多对一关联的产品。两者都是实体,并且 Address 有一个 ShippingAddress 子类。
让我们从数据库中 Session.get(..) 获取一个以 ShippingAddress 作为关联的产品。因为多对一是惰性的,所以它会返回一个Address代理。请注意,这是一个地址代理,而不是一个 ShippingAddress 代理,因为代理将始终与产品中提到的类型匹配(有关详细信息,请参阅 hibernate 书籍)。
该代理由 Hibernate 存储在其代理缓存中。现在,我们从数据库中 Session.get(...) 获取相同的 ShippingAddress,该地址与我们使用的从数据库中获取的产品相关联。现在 Hibernate 将发现它已经包含此 ShippingAddress 的代理并将返回它。但是,它会注意到类型不相同,因此必须进行“向下转型”。因为后一个操作对于“代理”来说是不可能的,所以它将创建新的操作并返回它......
正如你所看到的,没什么好担心的。 您可以考虑将地址设置为值类型...在我的情况下,这是没有选择的。
还有最后一张
以下是 NHibernate 的代码:StatefulPersistenceContext.cs -> NarrowProxy(..)
那么,到底有没有问题呢?我总是在程序中使用分离的对象。我希望有一个人可以帮助我。多谢。