请你给出NHibernate'代理'的简单定义。
作为一个例子,这是Manning Nhibernate in Action书中的引文:
'对于或 关联,懒惰提取是可能的 只有关联的类映射 启用代理。'
答案 0 :(得分:2)
这意味着它将创建一个继承原始实体的类,并覆盖表示关联类的实际属性。
通过这种方式,它可以实现从DB获取数据以实现懒惰的逻辑,而不是始终拥有该数据。
对于集合,虽然这是在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; }
}
}
这是一个非常简单的版本,希望它能让你深入了解它是如何工作的。这当然会给您的应用带来问题,因为您不会有实际实体类型的实例,而是派生的实例。如果您使用属性等对类进行了修饰,则可能无法识别这些类(取决于您的代码)。此外,如果你不小心,类型检查等可能会中断。
答案 1 :(得分:2)
当你有一个惰性关联时,NHibernate需要知道代码是否请求指向关联的属性,以便命中数据库并获取正确的实体。这是通过“代理”您的类来完成的,这意味着从您的类派生并覆盖属性获取和设置。这就是实体类需要具有公共属性virtual
的原因,因此它们可以在生成的派生(代理)类中重载。代理由配置中指定的代理工厂自动创建。