NHibernate Criteria和Lazy Load获取不需要的许多:许多实体

时间:2012-05-18 12:30:19

标签: nhibernate collections alias nhibernate-criteria

我无法使用Criteria映射我的实体以正确加载对象图。我的模型看起来像这样:

客户 - > CustomerCarriers - >客户,运营商 载体 - >客户

客户通过CustomerCarriers关联类与运营商进行多对多。我正在使用Left join来获取我需要过滤的对象。我对第三个别名没有问题,但是Carrier一个没有用。它正在向所有运营商返回客户,而不仅仅是我指定的活动运营商。

我在这里做错了什么?如果我在CustomerCarrer上指定内部联接,则此方法有效,但只有在至少有一个活动运营商时才会返回客户。

以下是我查询的内容:

var q = Session.CreateCriteria<Customer>()
                    .Add(Expression.Eq("CustomerID", customerId))
                    .CreateAlias("_carriers", "cars", JoinType.LeftOuterJoin)
                    .CreateAlias("cars.Carrier", "car", JoinType.LeftOuterJoin, Restrictions.Eq("car.isActive",true))
                    .CreateAlias("_customerFreightClasses", "cfc", JoinType.LeftOuterJoin, Restrictions.Eq("cfc.isActive",true))

                    ;

            var customer = q.UniqueResult<Customer>();
            return customer;

----更新---- 看看sql,我觉得我的问题不在于这个条件查询。我认为我的初步查询正在得到我想要的东西。但是,当我从代码中访问该属性时,我看到载体IsActive = False被加载,所以我认为即使我的初始查询是正确的,访问该集合也会得到任何尚未存在的内容。在我交付之前有没有办法关闭对象的懒惰?

我的客户映射会像这样到达CustomerCarrier:

HasMany<CustomerCarrier>(
                    Reveal.Member<Customer>("_carriers")
                )
                .Cascade.AllDeleteOrphan()
                .Fetch.Join()
                .Inverse()
                .KeyColumn("CustomerID")
                .AsSet()
                ;

我的CustomerCarrier映射会像这样到达运营商和客户:

References(x => x.Customer)
                .Not.Nullable()
                .Cascade.SaveUpdate()
                .Column("CustomerID")
                ;
            References(x => x.Carrier)
                .Not.Nullable()
                .Cascade.SaveUpdate()
                .Column("CarrierID")
                ;

0 个答案:

没有答案