NHibernate的Castle代理工厂是什么?它的任务是什么?在这种情况下代理意味着什么?
答案 0 :(得分:11)
可以使用Castle(其中包括您可以选择,也可以使用LinFu,Spring.NET,...)来创建实体的动态代理。
默认情况下,NHibernate使用动态代理来表示您的实体;通过这样做,当您从数据库中检索某个实体时,它能够返回一个对象,而不会填充所有属性。通过使用动态代理,只有在您真正引用属性时才会填充实体 (所以它是某种延迟加载;不要与延迟加载集合/关联混淆)。
这个行为是NHibernate希望你默认创建每个属性为虚拟的原因:NHibernate将使用继承自你的实体的Castle(或LinFu,...)代理提供程序创建一个新类,它将覆盖所有属性,以便它可以“注入”从数据库中检索必要数据所需的代码。
您可以通过在实体映射中指定“lazy = false”来禁用此行为。 (虽然,我确实认为即使您禁用此功能,NHibernate仍然会要求您使用其中一个代理工厂。)
答案 1 :(得分:3)
当你从ISession中选择一个实体时,你得到的不是真正的实体实例 - 你正在获得代理对象。 此代理对象继承您的实体,并由NHibernate用于跟踪对字段所做的更改。
答案 2 :(得分:3)