Nhibernate EagerLoad on demand

时间:2013-06-19 08:49:05

标签: c# asp.net-mvc fluent-nhibernate

我是流利的nhibernate的新手,遇到以下NHibernante错误:

Initializing[Toto.Business.Catalog.Unit#059fb247-df11-4457-8a4d-7c8b984a155e]-failed to lazily initialize a collection of role: Toto.Business.Catalog.Unit.Values, no session or session was closed

当我尝试访问item.Product.Product.Unit.Values时。我想通过在我的覆盖IAutoMappingOverride上使用.Not.LazyLoad()来解决它,但它会在其他我无法触摸的视图上制动。

我尝试过一些事情:

        NHibernateSession.Current.Query<BasketItem>()
                         .Fetch(e => e.Product.Product)
                         .ThenFetchMany(e => e.Unit.Values);

不改变任何东西。我尝试添加:

   foreach (var item in CurrentUserBasket.Items.Where(item => item.Product != null && item.Product.Product != null && item.Product.Product.Unit != null))
            {               
                NHibernateSession.Current.Load<IList<UnitValue>>(item.Product.Product.Unit.Values);
            }

但我给了我错误:

Unable to locate persister for the entity named 'System.Collections.Generic.IList`1[[Toto.Business.Catalog.UnitValue, Toto.Business, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'.

修改

我想在我的视图中访问item.Product.Product.Unit.Values,我该怎么做?

1 个答案:

答案 0 :(得分:1)

我不相信Query<T> api可以实现这一点,我很确定它只允许你获取最大深度为1。

您可以使用QueryOver<T> API执行此操作。

的内容
Product product = null;
Product nestedProduct = null;
Unit unit = null;
Value value = null;

var result = NHibernateSession
    .Current
    .QueryOver<BasketItem>()
    .JoinAlias(x => x.Product, () => product)
    .JoinAlias(x => x.Unit, () => unit)
    .JoinAlias(() => product.Product, () => nestedProduct)
    .JoinAlias(() => unit.Values, () => value)

另外值得记住的是,FluentNHibernate只是nhibernate的替代映射,它不会改变你在查询方面使用nhibernate的方式。