【发布时间】:2011-06-23 08:19:03
【问题描述】:
请给 NHibernate 'proxy' 一个简单的定义。
例如,这是来自 Manning Nhibernate in Action 的引文:
'对于一个或 关联,可以懒取 仅当关联的类映射 启用代理。'
【问题讨论】:
标签: .net nhibernate proxy
请给 NHibernate 'proxy' 一个简单的定义。
例如,这是来自 Manning Nhibernate in Action 的引文:
'对于一个或 关联,可以懒取 仅当关联的类映射 启用代理。'
【问题讨论】:
标签: .net nhibernate proxy
这意味着它将创建一个继承原始实体的类,并覆盖表示关联类的实际属性。
这样,它可以实现从数据库中获取数据以实现惰性的逻辑,而不是始终让数据可用。
不过,对于集合,这是在 ISet 和 IList 等的 NHibernate 版本中实现的。这仅在多对一或一对一关系中相关。
例子:
public class YourEntity {
public virtual OtherEntity Entity { get; set; }
}
public class DynamicProxyEntity : YourEntity {
private OtherEntity entity;
public override OtherEntity Entity {
get { return entity = LoadFromDb(); }
set { this.entity = value; }
}
}
这是一个非常简单的版本,希望它能让您深入了解它的工作原理。这当然会给您的应用程序带来问题,因为您不会有实际实体类型的实例,而是派生的实例。如果您使用属性等装饰了类,则可能无法识别这些类(取决于您的代码)。此外,如果您不小心,类型检查等可能会中断。
【讨论】:
当你有一个惰性关联时,NHibernate 需要知道代码何时请求指向关联的属性,以便访问数据库并获取正确的实体。这是通过“代理”您的类来完成的,这意味着从您的类派生并覆盖获取和设置的属性。这就是实体类需要具有公共属性virtual 的原因,因此它们可以在生成的派生(代理)类中重载。代理由配置中指定的代理工厂自动创建。
【讨论】: