我已经开始深入研究Nhibernate,虽然我喜欢很多东西,但我不喜欢一种:“生成代理”/延迟加载机制。在访问可能触发延迟加载的属性之前,我必须保持对ISession的某种引用并确保实体与会话相关联的想法在我的视图模型中比我理解的更多。在我使用的最后一个ORM映射器中,我们使用了一种不同的延迟加载方法,这种方法完全忽略了会话问题,而代价是POCO实体较少。我基本上想用nhibernate做同样的事情,有一些类似的语法:
public class Order
{
// this will introduced through the ctor using for ex an interceptor and Castle Windsor
private IOrmService ormService;
List<OrderLine> details = new List<OrderLine>();
public IEnumerable<OrderLine> Details
{
get
{
ormService.LazyLoad(this, o => o.Details);
return this.details;
}
}
}
其中的想法是,如果集合已经被加载,ormService将简单地忽略来自实体的延迟加载请求(永远不要处理状态管理问题:-))。我查看了NHibernateUtils类,它有一些Initialized和Initialize-collection方法,但是它们假设你使用的是代理。基本上,我需要一种告诉nhibernate的方式:“嘿,使用我给你的这个会话来填充这个属性”。国家管理等可以在外部处理。在Nhibernate中是否支持这样做?
答案 0 :(得分:1)
我对你的问题有点困惑。我觉得遵循Hibernate的最佳实践应该足够了,不需要重新发明已有的东西。以下是一些评论。
我必须保持一些想法 对ISession和。的引用 确保实体相关联 在访问之前的会话 可能触发的属性 延迟加载是一个更多的管道 我的观点模特比我欣赏
如果您遵循open session in view模式,这变得非常简单。
其中的想法是ormService 将简单地忽略懒惰的负载 如果是,请求来自实体 集合已经加载
这就是懒惰代理的功能。
基本上,我需要一种说法 nhibernate someting like:“嘿, 使用此填充此属性 我给你的会议“。
将对象分离/附加到会话时所执行的操作。惰性项将根据对象附加的会话加载。
答案 1 :(得分:1)
答案是否定的,没有代理就无法进行延迟加载。代理需要由NHibernate创建,或者您实现的任何类型的类或模式将产生相同的最终结果,除非您只是移动了代理生成的位置/方式。
对于延迟加载工作,它本身就需要ISession,否则它将无法连接到数据库以检索所需的值。
NH实现其代理模式的方式可能是至少在.NET 4.0之前实现的最佳方式,新的动态词可能会稍微改变一下。