2009-12-28 49 views
0

我已经开始深入研究Nhibernate,虽然有很多我喜欢的事情,但有一种我不喜欢:“生成代理”/延迟加载机制。在我看来,我必须保持某种对ISession的引用,并确保实体与会话相关联,然后才能访问可能会触发延迟加载的属性,这在我的视图模型中会更有帮助。在我使用的最后一个ORM映射器中,我们采用了一种不同的延迟加载方法,这使得用于以较少的POCO实体为代价完全忽略会话问题。基本上,我想做与NHibernate同样的事情,有一些语法类似于此: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中是否支持这个功能?

回答

1

我对你的问题有点困惑。我觉得下面的Hibernate最佳实践应该足够了,不需要重新发明已经存在的东西。这里有一些评论。

,我必须保持一定 排序参考的ISession和 确保实体与可能引发 延迟加载访问 属性之前会话关联 的想法是多一点的管道在 我的ViewModels比我欣赏

如果按照open session in view模式,这成为真的很容易。

凡想法是,如果 收集已加载

这是懒惰的代理做什么已经ormService 会根本不顾从实体延迟加载 请求。

基本上,我需要告诉像 成才的NHibernate的一种方式:“使用这种 会议,我现在给你哎, 填充这个属性”。

你在将对象分离/附加到会话时所做的事情。惰性项目将根据对象所附的会话加载。

1

答案是否定的,你不能没有代理的延迟加载。或者代理需要由NHibernate创建,或者您实现的任何类或模式都会产生相同的最终结果,除非您只是移动了代理生成的位置/方式。

对于惰性加载工作,它固有地需要ISession,否则将无法连接到数据库来检索所需的值。

NH实现其代理模式的方式可能是最好的,至少在.NET 4.0之前,这个新的动态词可能会让事情发生一些变化。